Saya memiliki dokumen XML yang harus saya uraikan dan / atau saya perlu membuat dokumen XML dan menulisnya ke teks (baik file atau memori). Karena pustaka standar C ++ tidak memiliki pustaka untuk ini, apa yang harus saya gunakan?
Catatan: Ini dimaksudkan sebagai pertanyaan definitif, C ++ - FAQ-style untuk ini. Jadi ya, itu adalah duplikat dari orang lain. Saya tidak sekadar menyesuaikan pertanyaan-pertanyaan lain itu karena mereka cenderung meminta sesuatu yang sedikit lebih spesifik. Pertanyaan ini lebih umum.
c++
xml-parsing
c++-faq
Nicol Bolas
sumber
sumber
Jawaban:
Sama seperti dengan wadah perpustakaan standar, perpustakaan apa yang harus Anda gunakan tergantung pada kebutuhan Anda. Inilah diagram alur yang nyaman:
Jadi pertanyaan pertama adalah ini: Apa yang Anda butuhkan?
Saya Membutuhkan Kepatuhan XML Penuh
OK, jadi Anda perlu memproses XML. Bukan mainan XML, XML nyata . Anda harus dapat membaca dan menulis semua spesifikasi XML, bukan hanya bit yang rendah dan mudah diurai. Anda memerlukan Namespace, DocTypes, subtitusi entitas, karya. Spesifikasi W3C XML, secara keseluruhan.
Pertanyaan selanjutnya adalah: Apakah API Anda harus sesuai dengan DOM atau SAX?
Saya Membutuhkan Penampilan DOM dan / atau SAX yang Tepat
OK, jadi Anda benar-benar membutuhkan API untuk menjadi DOM dan / atau SAX. Itu tidak bisa hanya menjadi pengurai gaya SAX, atau pengurai gaya DOM. Itu harus menjadi DOM aktual atau SAX yang sebenarnya, sejauh C ++ memungkinkan.
Kamu telah memilih:
Xerces
Itu pilihanmu. Ini cukup banyak parser / penulis C ++ XML yang memiliki penuh (atau sedekat C ++ memungkinkan) kesesuaian DOM dan SAX. Ini juga memiliki dukungan XInclude, dukungan XML Schema, dan sejumlah fitur lainnya.
Tidak memiliki dependensi nyata. Ini menggunakan lisensi Apache.
Saya Tidak Peduli Tentang DOM dan / atau SAX Conformance
Kamu telah memilih:
LibXML2
LibXML2 menawarkan antarmuka gaya-C (jika itu benar-benar mengganggu Anda, gunakan Xerces), meskipun antarmuka tersebut setidaknya berbasis objek dan mudah dibungkus. Ini menyediakan banyak fitur, seperti dukungan XInclude (dengan panggilan balik sehingga Anda dapat mengetahui dari mana file itu berasal), dukungan XPath 1.0, dukungan RelaxNG dan Schematron (meskipun pesan kesalahan meninggalkan banyak yang diinginkan), dan sebagainya.
Itu memang memiliki ketergantungan pada iconv, tetapi dapat dikonfigurasi tanpa ketergantungan itu. Meskipun itu berarti bahwa Anda akan memiliki seperangkat penyandian teks yang lebih terbatas, ia dapat diuraikan.
Ini menggunakan lisensi MIT.
Saya Tidak Membutuhkan Kepatuhan XML Penuh
OK, kepatuhan XML yang begitu lengkap tidak masalah bagi Anda. Dokumen XML Anda sepenuhnya berada di bawah kendali Anda atau dijamin untuk menggunakan "subset dasar" dari XML: tidak ada ruang nama, entitas, dll.
Jadi apa yang penting bagimu? Pertanyaan selanjutnya adalah: Apa hal terpenting bagi Anda dalam pekerjaan XML Anda?
Kinerja Parsing XML Maksimum
Aplikasi Anda perlu mengambil XML dan mengubahnya menjadi struktur data C ++ secepat konversi ini mungkin terjadi.
Kamu telah memilih:
RapidXML
Parser XML ini persis seperti yang tertulis di kaleng: XML cepat. Bahkan tidak berurusan dengan menarik file ke memori; bagaimana itu terjadi terserah Anda. Apa yang dikerjakannya adalah menguraikannya menjadi serangkaian struktur data C ++ yang dapat Anda akses. Dan ia melakukan ini secepat yang diperlukan untuk memindai file byte demi byte.
Tentu saja, tidak ada yang namanya makan siang gratis. Seperti kebanyakan parser XML yang tidak peduli dengan spesifikasi XML, XML cepat tidak menyentuh ruang nama, DocTypes, entitas (dengan pengecualian entitas karakter dan 6 yang XML dasar), dan sebagainya. Jadi pada dasarnya node, elemen, atribut, dan semacamnya.
Juga, ini adalah parser gaya DOM. Jadi itu mengharuskan Anda membaca semua teks. Namun, apa yang tidak dilakukannya adalah menyalin teks itu (biasanya). Cara RapidXML mendapatkan sebagian besar kecepatannya adalah dengan merujuk pada string di tempat . Ini membutuhkan lebih banyak manajemen memori di pihak Anda (Anda harus menjaga agar string tetap hidup saat RapidXML melihatnya).
RapidXML's DOM kosong. Anda bisa mendapatkan nilai string untuk berbagai hal. Anda dapat mencari atribut berdasarkan nama. Itu saja. Tidak ada fungsi kenyamanan untuk mengubah atribut menjadi nilai lain (angka, tanggal, dll). Anda hanya mendapatkan string.
Satu kelemahan lain dengan RapidXML adalah menyakitkan untuk menulis XML. Ini mengharuskan Anda untuk melakukan banyak alokasi memori eksplisit dari nama string untuk membangun DOM-nya. Itu memang menyediakan semacam buffer string, tapi itu masih membutuhkan banyak kerja eksplisit di pihak Anda. Ini memang fungsional, tetapi sulit digunakan.
Ini menggunakan lisensi MIT. Ini adalah perpustakaan hanya header yang tidak memiliki dependensi.
Saya Peduli Tentang Kinerja Tapi Tidak Cukup Banyak
Ya, kinerja penting bagi Anda. Tapi mungkin Anda perlu sesuatu yang sedikit lebih sederhana. Mungkin sesuatu yang dapat menangani lebih banyak Unicode, atau tidak memerlukan begitu banyak manajemen memori yang dikontrol pengguna. Kinerja masih penting, tetapi Anda menginginkan sesuatu yang sedikit kurang langsung.
Kamu telah memilih:
PugiXML
Secara historis, ini berfungsi sebagai inspirasi untuk RapidXML. Tetapi kedua proyek telah menyimpang, dengan Pugi menawarkan lebih banyak fitur, sementara RapidXML berfokus sepenuhnya pada kecepatan.
PugiXML menawarkan dukungan konversi Unicode, jadi jika Anda memiliki beberapa dokumen UTF-16 dan ingin membacanya sebagai UTF-8, Pugi akan menyediakannya. Bahkan memiliki implementasi XPath 1.0, jika Anda memerlukan hal semacam itu.
Namun Pugi masih cukup cepat. Seperti RapidXML, ia tidak memiliki dependensi dan didistribusikan di bawah Lisensi MIT.
Membaca Dokumen Besar
Anda perlu membaca dokumen yang diukur dalam ukuran gigabyte . Mungkin Anda mendapatkannya dari stdin, diberi makan oleh beberapa proses lain. Atau Anda membacanya dari file besar. Atau terserah. Intinya, yang Anda butuhkan adalah tidak harus membaca seluruh file ke dalam memori sekaligus untuk memprosesnya.
Kamu telah memilih:
LibXML2
API SAX-style Xerces akan bekerja dalam kapasitas ini, tetapi LibXML2 ada di sini karena itu sedikit lebih mudah untuk dikerjakan. API SAX-style adalah push-API: API mulai mengurai aliran dan hanya memadamkan peristiwa yang harus Anda tangkap. Anda dipaksa untuk mengelola konteks, keadaan, dan sebagainya. Kode yang bertuliskan API gaya SAX jauh lebih tersebar daripada yang diharapkan.
Objek LibXML2
xmlReader
adalah pull-API. Anda bertanya untuk pergi ke simpul atau elemen XML berikutnya; kamu tidak diberitahu. Ini memungkinkan Anda untuk menyimpan konteks sesuai keinginan Anda, untuk menangani entitas yang berbeda dengan cara yang jauh lebih mudah dibaca dalam kode daripada sekelompok panggilan balik.Alternatif
Expat
Expat adalah parser C ++ yang terkenal yang menggunakan API pull-parser. Itu ditulis oleh James Clark.
Statusnya saat ini aktif. Versi terbaru adalah 2.2.9, yang dirilis pada (2019-09-25).
LlamaXML
Ini adalah implementasi API gaya StAX. Ini adalah parser tarik, mirip dengan
xmlReader
parser LibXML2 .Tapi itu belum diperbarui sejak 2005. Jadi sekali lagi, Caveat Emptor.
Dukungan XPath
XPath adalah sistem untuk elemen permintaan dalam pohon XML. Ini adalah cara praktis untuk secara efektif menamai elemen atau kumpulan elemen dengan properti umum, menggunakan sintaksis terstandarisasi. Banyak perpustakaan XML menawarkan dukungan XPath.
Ada tiga pilihan di sini:
Selesaikan Pekerjaan
Jadi, Anda tidak peduli tentang kebenaran XML. Kinerja bukan masalah bagi Anda. Streaming tidak relevan. Yang Anda inginkan adalah sesuatu yang memasukkan XML ke dalam memori dan memungkinkan Anda untuk memasangnya kembali ke disk. Yang Anda pedulikan adalah API.
Anda menginginkan parser XML yang berukuran kecil, mudah dipasang, sepele untuk digunakan, dan cukup kecil agar tidak relevan dengan ukuran akhirnya yang dapat dieksekusi.
Kamu telah memilih:
TinyXML
Saya menempatkan TinyXML di slot ini karena ini adalah tentang braindead yang mudah digunakan seperti parser XML. Ya, lambat, tetapi sederhana dan jelas. Ini memiliki banyak fungsi kenyamanan untuk mengkonversi atribut dan sebagainya.
Menulis XML tidak ada masalah di TinyXML. Anda hanya
new
membuat beberapa objek, melampirkannya bersama-sama, mengirim dokumen kestd::ostream
, dan semua orang senang.Ada juga sesuatu dari ekosistem yang dibangun di sekitar TinyXML, dengan API yang lebih ramah-iterator, dan bahkan implementasi XPath 1.0 berlapis di atasnya.
TinyXML menggunakan lisensi zLib, yang kurang lebih merupakan Lisensi MIT dengan nama yang berbeda.
sumber
Ada pendekatan lain untuk menangani XML yang mungkin ingin Anda pertimbangkan, disebut XML data binding. Terutama jika Anda sudah memiliki spesifikasi formal kosa kata XML Anda, misalnya, dalam XML Schema.
Pengikatan data XML memungkinkan Anda untuk menggunakan XML tanpa benar-benar melakukan parsing atau serialisasi XML. Compiler pengikatan data otomatis membuat semua kode tingkat rendah dan menyajikan data yang diurai sebagai kelas C ++ yang sesuai dengan domain aplikasi Anda. Anda kemudian bekerja dengan data ini dengan memanggil fungsi, dan bekerja dengan tipe C ++ (int, double, dll) alih-alih membandingkan string dan teks parsing (yang Anda lakukan dengan API akses XML tingkat rendah seperti DOM atau SAX).
Lihat, misalnya, implementasi pengikatan data XML sumber terbuka yang saya tulis, CodeSynthesis XSD dan, untuk versi yang lebih ringan, bebas ketergantungan, CodeSynthesis XSD / e .
sumber
Satu catatan lain tentang Expat: ada baiknya mencari pekerjaan sistem tertanam. Namun, dokumentasi yang mungkin Anda temukan di web adalah kuno dan salah. Kode sumber sebenarnya memiliki komentar tingkat fungsi yang cukup menyeluruh, tetapi perlu beberapa pertimbangan bagi mereka untuk masuk akal.
sumber
Letakkan punyaku juga.
http://www.codeproject.com/Articles/998388/XMLplusplus-version-The-Cplusplus-update-of-my-XML
Tidak ada fitur validasi XML, tetapi cepat.
sumber
Baiklah kalau begitu. Saya telah membuat yang baru, karena tidak ada daftar yang tidak memenuhi kebutuhan saya.
Manfaat:
Kekurangan:
Proyek rumah
sumber
Di Secured Globe , Inc. kami menggunakan quickxml . Kami sudah mencoba yang lain tetapi rapidxml tampaknya menjadi pilihan terbaik bagi kami.
Berikut ini sebuah contoh:
sumber