Standart kütüphane kaplarında olduğu gibi, hangi kütüphaneyi kullanmanız gerektiğine bağlıdır. İşte uygun bir akış şeması:
İlk soru şudur: Neye ihtiyacınız var?
Tam XML Uyumluluğuna İhtiyacım Var
Tamam, bu yüzden XML'i işlemeniz gerekir. Oyuncak XML değil, gerçek XML. Yalnızca alçakta olan, ayrıştırması kolay bitleri değil, tüm XML özelliklerini de okuyabilmeniz ve yazabilmeniz gerekir . Ad Alanları, DocTypes, varlık ikamesi, işlere ihtiyacınız var. W3C XML Spesifikasyonu, bütünüyle.
Sonraki soru: API'nızın DOM veya SAX ile uyumlu olması gerekiyor mu?
Tam DOM ve / veya SAX Uyumluluğuna İhtiyacım Var
Tamam, bu yüzden DOM ve / veya SAX için gerçekten API'ye ihtiyacınız var. Sadece SAX tarzı bir itici ayrıştırıcı veya bir DOM tarzı tutulan ayrıştırıcı olamaz. Bu gereken C ++ izin verdiği ölçüde gerçek DOM veya gerçek SAX olmak.
Siz seçtiniz:
Xerces
Bu senin seçimin. DOM ve SAX uyumluluğu tam olan (veya C ++ 'ın izin verdiği kadar yakın) tek C ++ XML ayrıştırıcı / yazar. Ayrıca XInclude desteği, XML Şeması desteği ve diğer birçok özelliğe de sahiptir.
Gerçek bir bağımlılığı yoktur. Apache lisansını kullanır.
DOM ve / veya SAX Uyumluluğunu Önemiyorum
Siz seçtiniz:
libxml2
LibXML2, C-tarzı bir arayüz sunar (eğer gerçekten rahatsız ederseniz, Xerces'i kullanın), ancak arayüz en azından biraz nesne tabanlı ve kolayca sarılır. XInclude desteği (dosyayı nereden aldığını söyleyebilmeniz için geri çağrıları olan), XPath 1.0 tanıyıcı, RelaxNG ve Schematron desteği (hata mesajları arzulanan bir çok şey bıraksa da) gibi birçok özellik sağlar ve böylece.
İconv'ye bağımlılığı vardır, ancak bu bağımlılık olmadan yapılandırılabilir. Her ne kadar bu, ayrıştırabileceği daha sınırlı sayıda olası metin kodlamasına sahip olacağınız anlamına gelir.
MIT lisansını kullanır.
Tam XML Uyumluluğuna İhtiyacım Yok
Tamam, tam XML uyumluluğu sizin için önemli değil. XML belgeleriniz tamamen sizin kontrolünüz altındadır veya XML'in "temel alt kümesini" kullanması garanti edilir: ad alanı, varlık vb. Yok.
Peki senin için ne önemli? Bir sonraki soru: XML çalışmanızda sizin için en önemli şey nedir?
Maksimum XML Ayrıştırma Performansı
Uygulamanızın XML alması ve bu dönüşüm gerçekleşebileceği kadar hızlı bir şekilde C ++ veri yapılarına dönüştürmesi gerekir.
Siz seçtiniz:
RapidXML
Bu XML ayrıştırıcısı tam olarak kalayda yazdığı şeydir: hızlı XML. Dosyayı belleğe çekmekle bile ilgilenmiyor; bunun nasıl olduğu size kalmış. Bununla ilgilenen, erişebileceğiniz bir dizi C ++ veri yapısına ayrıştırmaktır. Ve bunu dosya bayt bayt taramak için gereken kadar hızlı yapar.
Tabii ki, ücretsiz öğle yemeği diye bir şey yoktur. XML spesifikasyonunu umursamayan çoğu XML ayrıştırıcısı gibi Hızlı XML de ad alanlarına, DocTypes'e, varlıklara (karakter varlıkları ve 6 temel XML olanlar hariç) dokunmaz. Temel olarak düğümler, elemanlar, nitelikler ve benzeri.
Ayrıca, DOM tarzı bir ayrıştırıcıdır. Bu nedenle, içindeki tüm metni okumanızı gerektirir. Ancak, yapmadığı şey o metnin herhangi birini (genellikle) kopyalamaktır . RapidXML'nin hızının çoğunu alma yolu, dizeleri yerinde ifade etmektir . Bu sizin tarafınızdan daha fazla bellek yönetimi gerektirir (RapidXML ona bakarken bu dizeyi canlı tutmalısınız).
RapidXML'nin DOM'si çıplak kemiktir. Şeyler için dize değerleri alabilirsiniz. Nitelikleri ada göre arayabilirsiniz. Bu kadar. Nitelikleri diğer değerlere (sayılar, tarihler, vb.) Dönüştürmek için kolaylık işlevi yoktur. Sadece ipler alıyorsun.
RapidXML ile diğer bir dezavantaj, XML yazmak için acı verici olmasıdır . DOM'sini oluşturmak için dize adlarının çok fazla açık bellek ayırmasını yapmanızı gerektirir. Bir tür dize arabelleği sağlar, ancak yine de sonunuzda çok fazla açık çalışma gerektirir. Kesinlikle işlevsel, ancak kullanmak için bir acı.
MIT lisansını kullanır. Bağımlılığı olmayan, yalnızca başlık içeren bir kitaplıktır.
Performansı önemsiyorum ama o kadar da değil
Evet, performans sizin için önemlidir. Ama belki biraz daha az çıplak kemiklere ihtiyacınız var. Belki daha fazla Unicode işleyebilen veya çok fazla kullanıcı tarafından kontrol edilen bellek yönetimi gerektirmeyen bir şey. Performans hala önemlidir, ancak biraz daha az doğrudan bir şey istersiniz.
Siz seçtiniz:
PugiXML
Tarihsel olarak, bu RapidXML için ilham kaynağı oldu. Ancak iki proje ayrıldı, Pugi daha fazla özellik sunarken, RapidXML tamamen hıza odaklandı.
PugiXML, Unicode dönüştürme desteği sunar, bu nedenle etrafında bazı UTF-16 dokümanlarınız varsa ve bunları UTF-8 olarak okumak istiyorsanız, Pugi sağlayacaktır. Bu tür bir şeye ihtiyacınız varsa, XPath 1.0 uygulaması bile vardır.
Ancak Pugi hala oldukça hızlı. RapidXML gibi, bağımlılığı yoktur ve MIT Lisansı altında dağıtılır.
Büyük Belgeleri Okuma
Boyut olarak gigabayt cinsinden ölçülen belgeleri okumalısınız . Belki onları stdin'den alıyorsunuz, başka bir süreçle besleniyorsunuz. Ya da onları büyük dosyalardan okuyorsunuz. Ya da her neyse. Mesele şu ki, ihtiyacınız olan şey tüm dosyayı işlemek için bir kerede belleğe okumak zorunda kalmamaktır .
Siz seçtiniz:
libxml2
Xerces'in SAX tarzı API'sı bu kapasitede çalışacak, ancak LibXML2 burada, çünkü çalışmak biraz daha kolay. SAX tarzı API bir push-API'dir: bir akışı ayrıştırmaya başlar ve sadece yakalamanız gereken etkinlikleri tetikler. Bağlamı, durumu vb. Yönetmek zorundasınız. SAX tarzı bir API okuyan kod, umduğundan çok daha fazla yayılmıştır.
LibXML2'nin xmlReader
nesnesi bir çekme API'sidir . Sen sor sonraki XML düğümü veya eleman gitmek için; size söylenmedi. Bu, bağlamı uygun gördüğünüz şekilde depolamanıza, farklı varlıkları kodda bir grup geri çağrıdan çok daha okunabilir bir şekilde işlemenize olanak tanır.
Alternatifler
Gurbetçi
Expat, pull-parser API kullanan iyi bilinen bir C ++ ayrıştırıcısıdır. James Clark tarafından yazılmıştır.
Mevcut durumu aktif. En son sürüm 2.2.9 sürümüdür (2019-09-25).
LlamaXML
StAX tarzı bir API uygulamasıdır. LibXML2'nin xmlReader
ayrıştırıcısına benzeyen bir çekme ayrıştırıcısıdır.
Ama 2005'ten beri güncellenmedi. Yine, Caveat Emptor.
XPath Desteği
XPath, bir XML ağacındaki öğeleri sorgulamak için bir sistemdir. Standart bir sözdizimi kullanarak bir öğeyi veya öğe koleksiyonunu ortak özelliklere göre etkili bir şekilde adlandırmanın kullanışlı bir yoludur. Birçok XML kitaplığı XPath desteği sunar.
Burada etkili bir şekilde üç seçenek vardır:
- LibXML2 : Tam XPath 1.0 desteği sağlar. Yine, bir C API'sı, bu yüzden sizi rahatsız ederse, alternatifler var.
- PugiXML : XPath 1.0 desteği ile birlikte geliyor. Yukarıdaki gibi, LibXML2'den daha çok bir C ++ API'sıdır, bu yüzden onunla daha rahat olabilirsiniz.
- TinyXML : XPath desteği ile birlikte gelmez, ancak bunu sağlayan TinyXPath kütüphanesi vardır. TinyXML, API'yı önemli ölçüde değiştiren sürüm 2.0'a dönüştürülüyor, bu nedenle TinyXPath yeni API ile çalışmayabilir. TinyXML'nin kendisi gibi, TinyXPath zLib lisansı altında dağıtılır.
Sadece İşi Tamamlayın
Bu nedenle, XML doğruluğunu umursamazsınız. Performans sizin için sorun değil. Akış önemsizdir. Tek istediğin olan şey belleğe XML alır ve bir daha geri diske üzerine sopa sağlar. Ne sen bakım yaklaşık API'sıdır.
Küçük, kurulumu kolay, kullanımı önemsiz ve nihai yürütülebilir dosyanızın boyutu ile alakasız olacak bir XML ayrıştırıcısı istiyorsunuz.
Siz seçtiniz:
TinyXML
TinyXML'yi bu yuvaya koydum çünkü XML ayrıştırıcılarının aldığı gibi kullanımı kolay bir braindead kadar basit. Evet, yavaş, ama basit ve açık. Öznitelikleri dönüştürmek için birçok kolaylık fonksiyonuna sahiptir.
TinyXML'de XML yazmak sorun değil. Sadece new
bazı nesneler kadar, bunları birbirine tutturmak bir belgeyi göndermek std::ostream
ve herkesin mutlu.
Ayrıca, daha yineleyici dostu bir API ile TinyXML etrafında inşa edilmiş bir ekosistem ve hatta bunun üzerine katmanlı bir XPath 1.0 uygulaması da var.
TinyXML, aşağı yukarı farklı bir ada sahip MIT Lisansı olan zLib lisansını kullanır.