เช่นเดียวกับคอนเทนเนอร์ไลบรารีมาตรฐานไลบรารีใดที่คุณควรใช้ขึ้นอยู่กับความต้องการของคุณ นี่คือผังงานที่สะดวก:
ดังนั้นคำถามแรกคือสิ่งนี้คุณต้องการอะไร
ฉันต้องการมาตรฐาน XML แบบเต็ม
ตกลงดังนั้นคุณต้องดำเนินการกับ XML ไม่ใช่ของเล่น XML, XML จริง คุณจะต้องมีความสามารถในการอ่านและเขียนทั้งหมดของข้อกำหนด XML ที่ไม่เพียง แต่บิตต่ำ, ง่ายต่อการแยก คุณต้องการเนมสเปซ, DocTypes, การแทนที่เอนทิตี, การทำงาน ข้อกำหนด W3C XML อย่างครบถ้วน
คำถามต่อไปคือ: API ของคุณจำเป็นต้องสอดคล้องกับ DOM หรือ SAX หรือไม่
ฉันต้องการ DOM ที่แน่นอนและ / หรือความสอดคล้องของ SAX
ตกลงดังนั้นคุณต้องใช้ API เป็น DOM และ / หรือ SAX จริงๆ ไม่เพียงแค่เป็นตัวแยกวิเคราะห์แบบพุช SAX หรือตัวแยกวิเคราะห์แบบ DOM เท่านั้น มันจะต้องเป็น DOM ที่เกิดขึ้นจริงหรือแซ็กโซโฟนที่เกิดขึ้นจริงในขอบเขตที่ C ++ ช่วยให้
คุณได้เลือก:
xerces
นั่นคือทางเลือกของคุณ มันค่อนข้างแยกวิเคราะห์ C ++ XML เท่านั้นที่มีเต็ม (หรือใกล้เคียงที่สุดเท่าที่อนุญาตให้ C + +) DOM และ SAX สอดคล้อง นอกจากนี้ยังมีการรองรับ XInclude สนับสนุน XML Schema และคุณสมบัติอื่น ๆ อีกมากมาย
มันไม่มีการพึ่งพาที่แท้จริง มันใช้สิทธิ์การใช้งาน Apache
ฉันไม่สนใจ DOM และ / หรือ SAX
คุณได้เลือก:
libxml2
LibXML2 เสนออินเทอร์เฟซแบบ C (ถ้ามันรบกวนคุณจริง ๆ ให้ไปใช้ Xerces) แม้ว่าอินเทอร์เฟซนั้นจะค่อนข้างใช้วัตถุและห่อหุ้มได้ง่าย มันมีคุณสมบัติมากมายเช่นการสนับสนุน XInclude (ด้วยการโทรกลับเพื่อให้คุณสามารถบอกได้ว่ามันรับไฟล์มาจากที่ใด) ตัวจดจำ XPath 1.0, RelaxNG และ Schematron รองรับ (แม้ว่าข้อความผิดพลาดจะออกมาเยอะ ) และ เป็นต้นไป
มันมีการพึ่งพาบน iconv แต่มันสามารถกำหนดค่าโดยไม่ต้องพึ่งพานั้น แม้ว่านั่นหมายความว่าคุณจะมีการเข้ารหัสข้อความที่เป็นไปได้ จำกัด มากขึ้นซึ่งสามารถแยกวิเคราะห์ได้
มันใช้สิทธิ์การใช้งาน MIT
ฉันไม่ต้องการการปฏิบัติตาม XML แบบเต็ม
ตกลงดังนั้นการปฏิบัติตาม XML แบบสมบูรณ์จึงไม่สำคัญกับคุณ เอกสาร XML ของคุณอยู่ภายใต้การควบคุมของคุณอย่างสมบูรณ์หรือรับประกันว่าจะใช้ "ชุดย่อยพื้นฐาน" ของ XML: ไม่มีเนมสเปซ, เอนทิตี ฯลฯ
แล้วคุณมีความสำคัญอย่างไร คำถามต่อไปคืออะไรสิ่งที่สำคัญที่สุดสำหรับคุณใน XML ของคุณคืออะไร
ประสิทธิภาพการแยกวิเคราะห์ XML สูงสุด
แอปพลิเคชันของคุณต้องใช้ XML และเปลี่ยนเป็นโครงสร้างข้อมูล C ++ เร็วเท่าที่การแปลงนี้อาจเกิดขึ้นได้
คุณได้เลือก:
RapidXML
ตัวแยกวิเคราะห์ XML นี้เป็นสิ่งที่ตรงตามที่ระบุใน tin: rapid XML มันไม่ได้จัดการกับการดึงไฟล์ลงในหน่วยความจำ สิ่งที่เกิดขึ้นนั้นขึ้นอยู่กับคุณ สิ่งที่เกี่ยวข้องกับการแยกวิเคราะห์นั้นเป็นชุดของโครงสร้างข้อมูล C ++ ที่คุณสามารถเข้าถึงได้ และมันทำได้เร็วพอ ๆ กับการสแกนไบต์ไฟล์ด้วยไบต์
แน่นอนไม่มีสิ่งใดเป็นอาหารกลางวันฟรี เช่นเดียวกับตัวแยกวิเคราะห์ XML ส่วนใหญ่ที่ไม่สนใจเกี่ยวกับข้อกำหนด XML Rapid XML ไม่ได้สัมผัสกับเนมสเปซ, DocTypes, เอนทิตี (ยกเว้นข้อผิดพลาดของตัวอักขระและ XML พื้นฐาน 6 ตัว) และอื่น ๆ โดยพื้นฐานแล้วโหนดองค์ประกอบองค์ประกอบและอื่น ๆ
นอกจากนี้ยังเป็นตัวแยกวิเคราะห์สไตล์ DOM ดังนั้นจึงจำเป็นต้องให้คุณอ่านข้อความทั้งหมดอย่างไรก็ตามสิ่งที่ไม่ได้ทำคือคัดลอกข้อความใด ๆ (ปกติ) วิธี RapidXML ได้รับมากที่สุดของความเร็วคือโดยหมายถึงสตริงในสถานที่ สิ่งนี้ต้องการการจัดการหน่วยความจำเพิ่มเติมในส่วนของคุณ (คุณต้องเก็บสตริงนั้นไว้ในขณะที่ RapidXML ดูอยู่)
DOM ของ RapidXML เป็นกระดูกเปลือย คุณสามารถรับค่าสตริงสำหรับสิ่งต่าง ๆ คุณสามารถค้นหาคุณสมบัติตามชื่อ เกี่ยวกับมัน. ไม่มีฟังก์ชั่นอำนวยความสะดวกในการเปลี่ยนแอททริบิวเป็นค่าอื่น ๆ (ตัวเลข, วันที่, ฯลฯ ) คุณเพิ่งได้รับสาย
ข้อเสียอีกอย่างหนึ่งของ RapidXML คือมันเจ็บปวดกับการเขียน XML ต้องการให้คุณทำการจัดสรรหน่วยความจำอย่างชัดเจนของชื่อสตริงเพื่อสร้าง DOM มันให้ชนิดของบัฟเฟอร์สตริง แต่ยังคงต้องใช้งานจำนวนมากอย่างชัดเจนในตอนท้ายของคุณ มันใช้งานได้ดี แต่มันเจ็บปวดที่จะใช้
มันใช้สิทธิ์การใช้งาน MIT เป็นไลบรารีแบบส่วนหัวเท่านั้นโดยไม่มีการขึ้นต่อกัน
ฉันสนใจเกี่ยวกับประสิทธิภาพ แต่ก็ไม่มาก
ใช่ประสิทธิภาพเป็นสิ่งสำคัญสำหรับคุณ แต่บางทีคุณอาจต้องการบางสิ่งบางอย่างที่เปลือยเปล่าน้อยลง บางทีสิ่งที่สามารถจัดการ Unicode ได้มากขึ้นหรือไม่ต้องการการจัดการหน่วยความจำที่ผู้ใช้ควบคุมมากนัก ประสิทธิภาพยังคงเป็นสิ่งสำคัญ แต่คุณต้องการบางสิ่งที่ตรงไปตรงมาเล็กน้อย
คุณได้เลือก:
PugiXML
ในอดีตสิ่งนี้ทำหน้าที่เป็นแรงบันดาลใจสำหรับ RapidXML แต่โครงการทั้งสองนั้นแยกจากกันโดย Pugi นำเสนอฟีเจอร์ที่มากขึ้นในขณะที่ RapidXML นั้นเน้นไปที่ความเร็ว
PugiXML เสนอการสนับสนุนการแปลง Unicode ดังนั้นหากคุณมีเอกสาร UTF-16 บางส่วนและต้องการอ่านเป็น UTF-8 Pugi จะให้บริการ มันยังมีการติดตั้ง XPath 1.0 หากคุณต้องการสิ่งนั้น
แต่ Pugi ก็ยังค่อนข้างเร็ว เช่น RapidXML ไม่มีการอ้างอิงและเผยแพร่ภายใต้สิทธิ์การใช้งานของ MIT
อ่านเอกสารขนาดใหญ่
คุณจะต้องอ่านเอกสารที่มีวัดในกิกะไบต์ในขนาด บางทีคุณอาจได้พวกมันมาจาก stdin โดยถูกเลี้ยงโดยกระบวนการอื่น หรือคุณกำลังอ่านจากไฟล์ขนาดใหญ่ หรืออะไรก็ตาม ประเด็นคือสิ่งที่คุณต้องการคือไม่ต้องอ่านไฟล์ทั้งหมดในหน่วยความจำทั้งหมดในครั้งเดียวเพื่อดำเนินการ
คุณได้เลือก:
libxml2
API แบบ SAX ของ Xerces จะทำงานได้ในความสามารถนี้ แต่ LibXML2 อยู่ที่นี่เพราะทำงานได้ง่ายขึ้นเล็กน้อย API สไตล์ SAX เป็น push-API: มันเริ่มต้นในการแยกวิเคราะห์กระแสข้อมูลและเพียงดับกิจกรรมที่คุณต้องจับ คุณถูกบังคับให้จัดการบริบทของรัฐและอื่น ๆ รหัสที่อ่าน API แบบ SAX นั้นมีมากมายมากกว่าที่หวังไว้
xmlReader
วัตถุของ LibXML2 คือ pull-API คุณขอให้ไปที่โหนดหรือองค์ประกอบ XML ถัดไป คุณไม่ได้บอก สิ่งนี้ช่วยให้คุณสามารถเก็บบริบทตามที่เห็นสมควรเพื่อจัดการเอนทิตีต่าง ๆ ในลักษณะที่สามารถอ่านได้ในโค้ดมากกว่าการโทรกลับเป็นจำนวนมาก
ทางเลือก
ชาวต่างชาติ
ชาวต่างชาติเป็นตัวแยกวิเคราะห์ C ++ ที่รู้จักกันดีซึ่งใช้ pull-parser API มันเขียนโดย James Clark
สถานะปัจจุบันใช้งานได้ รุ่นล่าสุดคือ 2.2.9 ซึ่งเผยแพร่เมื่อ (2019-09-25)
LlamaXML
มันเป็นการใช้งาน API แบบ StAX มันเป็นตัวแยกวิเคราะห์ที่คล้ายกับxmlReader
ตัวแยกวิเคราะห์ของ LibXML2
แต่มันยังไม่ได้รับการปรับปรุงตั้งแต่ปี 2005 อีกครั้ง Caveat Emptor
สนับสนุน XPath
XPath เป็นระบบสำหรับการสืบค้นองค์ประกอบภายในแผนผัง XML มันเป็นวิธีที่สะดวกในการตั้งชื่อองค์ประกอบหรือชุดขององค์ประกอบโดยใช้คุณสมบัติทั่วไปโดยใช้ไวยากรณ์มาตรฐาน ไลบรารี XML จำนวนมากเสนอการสนับสนุน XPath
มีสามตัวเลือกอย่างมีประสิทธิภาพที่นี่:
- LibXML2 : รองรับ XPath 1.0 อย่างเต็มรูปแบบ อีกครั้งเป็น C API ดังนั้นหากรบกวนคุณก็มีทางเลือกอื่น
- PugiXML : มันมาพร้อมกับรองรับ XPath 1.0 เช่นกัน ดังที่กล่าวไว้ข้างต้นเป็น C ++ API มากกว่า LibXML2 ดังนั้นคุณอาจรู้สึกสบายใจ
- TinyXML : มันไม่ได้มาพร้อมกับการสนับสนุน XPath แต่มีไลบรารีTinyXPathที่ให้บริการ TinyXML อยู่ระหว่างการแปลงเป็นเวอร์ชั่น 2.0 ซึ่งเปลี่ยนแปลง API ได้อย่างมากดังนั้น TinyXPath อาจไม่ทำงานกับ API ใหม่ เช่นเดียวกับ TinyXML เอง TinyXPath นั้นเผยแพร่ภายใต้ลิขสิทธิ์ zLib
เพิ่งได้งานทำ
ดังนั้นคุณไม่สนใจเกี่ยวกับความถูกต้องของ XML ประสิทธิภาพไม่ใช่ปัญหาสำหรับคุณ การสตรีมไม่เกี่ยวข้อง สิ่งที่คุณต้องการคือสิ่งที่ทำให้ XML เข้าสู่หน่วยความจำและช่วยให้คุณสามารถนำมันกลับไปไว้บนดิสก์อีกครั้ง สิ่งที่คุณสนใจคือ API
คุณต้องการตัวแยกวิเคราะห์ XML ที่จะมีขนาดเล็กติดตั้งง่ายใช้งานง่ายและเล็กพอที่จะไม่เกี่ยวข้องกับขนาดของไฟล์ประมวลผลในที่สุดของคุณ
คุณได้เลือก:
tinyxml
ฉันวาง TinyXML ในช่องนี้เพราะมันเกี่ยวกับเรื่องง่าย ๆ ที่จะใช้เป็นตัวแยกวิเคราะห์ XML ที่ได้รับ ใช่มันช้า แต่เรียบง่ายและชัดเจน มันมีฟังก์ชั่นอำนวยความสะดวกมากมายสำหรับการแปลงคุณสมบัติและอื่น ๆ
การเขียน XML ไม่มีปัญหาใน TinyXML คุณเพิ่งnew
วางวัตถุบางอย่างแนบมันเข้าด้วยกันส่งเอกสารไปที่ a std::ostream
และทุกคนก็มีความสุข
นอกจากนี้ยังมีระบบนิเวศที่สร้างขึ้นรอบ ๆ TinyXML พร้อมด้วย API ที่เป็นมิตรกับ iterator มากกว่าและแม้แต่การติดตั้ง XPath 1.0 ที่ติดตั้งไว้ด้านบน
TinyXML ใช้สิทธิ์การใช้งาน zLib ซึ่งมากหรือน้อยกับ MIT License ที่มีชื่อแตกต่างกัน