Легкий синтаксический анализатор XML, эффективный для больших файлов?
Мне нужно проанализировать потенциально огромные XML-файлы, поэтому я думаю, что это исключает Парсеры DOM.
есть ли хороший легкий парсер SAX для C++, сравнимый с TinyXML на footprint? Структура XML очень проста, никаких продвинутых вещей, таких как пространства имен и DTDs не требуется. Просто элементы, атрибуты и cdata.
Я знаю о Xerces, но его размер более 50 МБ дает мне дрожь.
спасибо!
9 ответов
Если вы используете C, то вы можете использовать в libxml С Гном. Вы можете выбрать один из интерфейсов DOM и SAX для вашего документа, а также множество дополнительных функций, которые были разработаны в течение многих лет. Если вы действительно хотите C++, то вы можете использовать libxml++, который является оболочкой C++ OO вокруг LibXML.
библиотека была доказана снова и снова, является высокой производительностью и может быть скомпилирована практически на любой платформе, которую вы можете находить.
Мне нравится экспат
http://expat.sourceforge.net/
Он основан на C, но есть несколько оболочек C++, чтобы помочь.
http://sourceforge.net/projects/wsdlpull это прямой порт c++ api java xmlpull (http://www.xmlpull.org/)
Я бы настоятельно рекомендовал этот парсер. Мне пришлось настроить его для использования на моем встроенном устройстве (без поддержки STL), но я обнаружил, что он очень быстрый и очень мало накладных расходов. Я должен был сделать свои собственные классы string и vector, и даже с теми, которые он компилирует примерно до 60k в windows.
Я думаю, что потянет синтаксический анализ намного более интуитивен, чем что-то вроде саксофона. Код гораздо более точно отражает xml-документ, что упрощает корреляцию двух.
один недостаток заключается в том, что он только вперед, что означает, что вам нужно проанализировать элементы по мере их поступления. У нас довольно запутанный дизайн для чтения наших конфигурационных файлов, и мне нужно разобрать целое поддерево, сделать некоторые проверки, затем установить некоторые значения по умолчанию, а затем снова разобрать. С помощью этого парсера единственный реальный способ справиться с чем-то подобным чтобы сделать копию состояния, проанализируйте ее, а затем продолжите работу с оригиналом. Это все еще заканчивается большой победой с точки зрения ресурсов против нашего старого парсера DOM.
Если ваша структура XML очень проста, вы можете рассмотреть возможность создания простого лексера / сканера на основе lex/yacc (flex / bison) . Источники в W3C могут вдохновить вас:http://www.w3.org/XML/9707/parser.y и http://www.w3.org/XML/9707/scanner.l.
см. также интерфейс SAX2 в libxml
firstobject это CMarkup это класс C++, который работает как легкий огромный файл pull parser (я рекомендую pull parser, а не SAX), и огромный XML-файл writer тоже. Он добавляет до 250kb к исполняемому файлу. При использовании в памяти он имеет 1/3 следа ноги tinyxml отчетом одного потребителя. При использовании в огромном файле он содержит только небольшой буфер (например, 16kb) в памяти. CMarkup в настоящее время является коммерческим продуктом, поэтому он поддерживается, документируется и легко добавляется ваш проект с одним cpp и H-файлом.
самый простой способ попробовать это с помощью скрипта в бесплатном редакторе FIRSTOBJECT XML, например:
ParseHugeXmlFile() { CMarkup xml; xml.Open( "HugeFile.xml", MDF_READFILE ); while ( xml.FindElem("//record") ) { // process record... str sRecordId = xml.GetAttrib( "id" ); xml.IntoElem(); xml.FindElem( "description" ); str sDescription = xml.GetData(); } xml.Close(); }
в меню Файл выберите Новая программа, вставьте ее и измените для своих элементов и атрибутов, нажмите F9, чтобы запустить ее, или F10, чтобы пройти через нее строка за строкой.
вы можете попробовать http://die-xml.googlecode.com/ . он кажется очень маленьким и простым в использовании
Это недавно сделанный C++0x XML SAX parser с открытым исходным кодом, и автор готов к обратным связям
он анализирует входной поток и генерирует события при обратных вызовах, совместимых с std::function
машина стека использует конечные автоматы в качестве бэкэнда, а некоторые события (начальный тег и текстовые узлы) используют итераторы для минимизации буферизации, что делает его довольно легкий
Я бы посмотрел на инструменты, которые создать синтаксический анализатор DTD/схемы Если вы хотите маленький и быстрый. Они очень хороши для огромных документов.
рекомендую pugixml
pugixml-это легкая библиотека обработки XML на C++.
"pugixml-это библиотека обработки XML на C++, которая состоит из DOM-подобного интерфейса с богатыми возможностями обхода/модификации, чрезвычайно быстрого синтаксического анализа XML, который создает дерево DOM из XML-файла/буфера, и реализации XPath 1.0 для сложных запросов дерева, управляемых данными. Полная поддержка Unicode также доступна, с интерфейсом Unicode варианты и преобразования между различными кодировками Unicode."
я протестировал несколько синтаксических анализаторов XML, включая несколько дорогих, перед выбором и использованием pugixml в коммерческом продукте.
pugixml был не только самым быстрым парсером, но и имел самый зрелый и дружественный API. Очень рекомендую. Это очень стабильный продукт! Я начал использовать его с версии 0.8. Сейчас он составляет 1,7.
большим бонусом в этом парсере является XPath 1.0 реализация! Для любых более сложных запросов дерева XPath-это функция, посланная Богом!
DOM-подобный интерфейс с богатыми возможностями обхода / модификации чрезвычайно полезен для решения реальных" тяжелых " XML-файлов.
Это небольшой, быстрый парсер. Это хороший выбор даже для iOS или Android-приложения, если вы не против связать код c++.
критерии могут многое рассказать. Смотри:http://pugixml.org/benchmark.html
несколько примеров для (x86):
pugixml is more than 38 times faster than TinyXML
4.1 times faster than CMarkup,
2.7 times faster than expat or libxml
For (x64) pugixml-самый быстрый парсер, который я знаю.
проверьте также использование памяти синтаксическим анализатором XML. Некоторые Парсеры просто пожирают драгоценную память!