Легкий синтаксический анализатор 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++, чтобы помочь.


RapidXML довольно быстрый парсер для XML, написанного на 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. Некоторые Парсеры просто пожирают драгоценную память!