Легкий анализатор XML, эффективный для больших файлов?

StackOverflow https://stackoverflow.com/questions/1006543

Вопрос

Мне нужно проанализировать потенциально огромные XML-файлы, поэтому я предполагаю, что это исключает парсеры DOM.

Есть ли какой-нибудь хороший облегченный синтаксический анализатор SAX для C ++, сравнимый по занимаемой площади с TinyXML?Структура XML очень проста, никаких продвинутых вещей, таких как пространства имен и DTD, не требуется.Просто элементы, атрибуты и cdata.

Я знаю о Xerces, но сам его размер - более 50 мб - вызывает у меня дрожь.

Спасибо!

Это было полезно?

Решение

Если вы используете C, то вы можете использовать LibXML из Гном проект.Вы можете выбрать один из интерфейсов DOM и SAX для вашего документа, а также множество дополнительных функций, которые разрабатывались годами.Если вам действительно нужен C ++, то вы можете использовать libxml++, который является оболочкой C ++ OO вокруг LibXML.

Библиотека была проверена снова и снова, обладает высокой производительностью и может быть скомпилирована практически на любой платформе, которую вы можете найти.

Другие советы

Мне нравятся эмигранты
http://expat.sourceforge.net/

Он основан на C, но есть несколько оболочек C ++, которые помогут.

RapidXML - Быстрый xml - файл это довольно быстрый анализатор XML, написанный на C ++.

http://sourceforge.net/projects/wsdlpull это прямой порт на c ++ java xmlpull api (http://www.xmlpull.org/)

Я бы очень рекомендовал этот анализатор.Мне пришлось настроить его для использования на моем встроенном устройстве (без поддержки STL), но я обнаружил, что это очень быстро и с очень небольшими накладными расходами.Мне пришлось создать свои собственные классы string и vector, и даже с теми, которые он компилирует примерно до 60 кб в Windows.

Я думаю, что pull-синтаксический анализ намного более интуитивно понятен, чем что-то вроде SAX.Код гораздо более точно отражает 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

первый объект CМаркап это класс C ++, который работает как облегченный анализатор извлечения огромных файлов (я рекомендую анализатор извлечения, а не SAX), а также как средство записи огромных XML-файлов.Это добавляет примерно 250 кб к вашему исполняемому файлу.При использовании в памяти он занимает 1/3 площади tinyxml по отчету одного пользователя.При использовании с огромным файлом он содержит в памяти только небольшой буфер (например, 16 кб).CMarkup в настоящее время является коммерческим продуктом, поэтому он поддерживается, документирован и разработан таким образом, чтобы его было легко добавить в ваш проект с помощью одного cpp- и h-файла.

Самый простой способ попробовать это - с помощью скрипта в бесплатном XML-редакторе firstobject, такого как этот:

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, чтобы пошагово просмотреть ее построчно.

вы можете попробовать https://github.com/thinlizzy/die-xml .он кажется очень маленьким и простым в использовании

это недавно созданный синтаксический анализатор C ++ 0x XML SAX с открытым исходным кодом, и автор готов предоставить отзывы

он анализирует входной поток и генерирует события при обратных вызовах, совместимых с std::function

стековая машина использует конечные автоматы в качестве серверной части, а некоторые события (начальный тег и текстовые узлы) используют итераторы для минимизации буферизации, что делает ее довольно легкой

Я бы посмотрел на инструменты, которые создайте анализатор, зависящий от DTD / схемы если вы хотите маленький и быстрый.Они очень хороши для больших документов.

Я настоятельно рекомендую пугиксмл

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

Для (x64) pugixml - самый быстрый синтаксический анализатор, который я знаю.

Проверьте также использование памяти вашим анализатором XML.Некоторые парсеры просто пожирают драгоценную память!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top