Как и со стандартными контейнерами библиотеки, какая библиотека вам нужна, зависит от ваших потребностей. Вот удобная блок-схема:
Итак, первый вопрос: что вам нужно?
Мне нужно полное соответствие XML
Итак, вам нужно обработать XML. Не игрушечный XML, настоящий XML. Вы должны уметь читать и записывать все спецификации XML, а не только низколежащие, легко разбираемые биты. Вам нужны Пространства имен, DocTypes, замена сущностей, все работы. Спецификация W3C XML в полном объеме.
Следующий вопрос: должен ли ваш API соответствовать DOM или SAX?
Мне нужно точное соответствие DOM и / или SAX
Итак, вам действительно нужно, чтобы API был DOM и / или SAX. Это не может быть просто push-анализатор в стиле SAX или сохраненный синтаксический анализатор в стиле DOM. Это должен быть фактический DOM или фактический SAX, если это позволяет C ++.
Ты выбрал:
Xerces
Это ваш выбор. Это практически единственный синтаксический анализатор / писатель C ++ XML, имеющий полное (или настолько близкое, насколько позволяет C ++) соответствие DOM и SAX. Он также имеет поддержку XInclude, поддержку XML-схемы и множество других функций.
У него нет реальных зависимостей. Он использует лицензию 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 именно то, что он говорит о жестяной коробке: быстрый XML. Это даже не имеет дело с извлечением файла в память; как это происходит, зависит от вас. Что он делает, так это разбирает его на ряд структур данных C ++, к которым вы можете получить доступ. И это происходит примерно так же быстро, как и сканирование файла за байтом.
Конечно, нет такого понятия, как бесплатный обед. Как и большинство синтаксических анализаторов XML, которые не заботятся о спецификации XML, Rapid XML не затрагивает пространства имен, типы документов, сущности (за исключением символьных сущностей и 6 основных XML) и так далее. Так что в основном узлы, элементы, атрибуты и тому подобное.
Кроме того, это синтаксический анализатор в стиле DOM. Так что требуется, чтобы вы прочитали весь текст. Однако, он не копирует этот текст (обычно). RapidXML получает большую часть своей скорости, обращаясь к строкам на месте . Это требует большего управления памятью с вашей стороны (вы должны поддерживать эту строку, пока RapidXML смотрит на нее).
DOM RapidXML является голым. Вы можете получить строковые значения для вещей. Вы можете искать атрибуты по имени. Вот и все. Нет удобных функций для преобразования атрибутов в другие значения (числа, даты и т. Д.). Вы просто получаете строки.
Еще одним недостатком RapidXML является то, что это болезненно для написания XML. Это требует, чтобы вы сделали много явного выделения памяти имен строк, чтобы построить его DOM. Он обеспечивает своего рода строковый буфер, но это все еще требует много явной работы с вашей стороны. Это, конечно, функционально, но это неудобно.
Он использует лицензию MIT. Это библиотека только для заголовков без каких-либо зависимостей.
Я забочусь о производительности, но не так уж много
Да, производительность важна для вас. Но, может быть, вам нужно что-то чуть менее голое. Может быть, что-то, что может обрабатывать больше Unicode, или не требует такого большого количества управляемой пользователем памяти Производительность по-прежнему важна, но вы хотите что-то менее прямое.
Ты выбрал:
PugiXML
Исторически это послужило вдохновением для RapidXML. Но оба проекта разошлись: Pugi предлагает больше возможностей, а RapidXML полностью ориентирован на скорость.
PugiXML предлагает поддержку преобразования Unicode, поэтому, если у вас есть несколько документов UTF-16 и вы хотите прочитать их как UTF-8, Pugi предоставит. Он даже имеет реализацию XPath 1.0, если вам нужна такая вещь.
Но Пуги все еще довольно быстр. Как и RapidXML, он не имеет зависимостей и распространяется под лицензией MIT.
Чтение огромных документов
Вам необходимо прочитать документы размером в гигабайты . Может быть, вы получаете их от стандартного ввода, питаясь каким-то другим процессом. Или вы читаете их из массивных файлов. Или что угодно. Дело в том, что вам не нужно читать весь файл в память сразу, чтобы обработать его.
Ты выбрал:
LibXML2
API-интерфейс Xerces в стиле SAX будет работать в этом качестве, но LibXML2 здесь, потому что с ним немного легче работать. API в стиле SAX - это push-API: он начинает синтаксический анализ потока и просто запускает события, которые вы должны перехватить. Вы вынуждены управлять контекстом, состоянием и так далее. Код, который читает API в стиле SAX, гораздо более распространен, чем можно было бы надеяться.
Объект LibXML2 xmlReader
представляет собой pull-API. Вы просите перейти к следующему узлу или элементу XML; тебе не сказали. Это позволяет вам сохранять контекст так, как вы считаете нужным, обрабатывать различные объекты таким образом, который в коде гораздо более читабелен, чем набор обратных вызовов.
альтернативы
эмигрант
Expat - это известный синтаксический анализатор C ++, использующий API-интерфейс pull-parser. Это было написано Джеймсом Кларком.
Это текущий статус активен. Самая последняя версия - 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 и даже многоуровневой реализацией XPath 1.0.
TinyXML использует лицензию zLib, которая является более или менее лицензией MIT с другим именем.