Вопрос по parsing, c++, xml – Облегченный парсер XML, эффективный для больших файлов?

8

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

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

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

Спасибо!

Ваш Ответ

9   ответов
7

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

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

Если вы действительно беспокоитесь о размере, попробуйте Expat наexpat.sourceforge.net  Размер моей общей библиотеки на моем компьютере с Linux составляет 133 КБ. Я предполагаю, что статически скомпилированный .a в ваш код будет таким же или около того.
Спасибо за ответ. LibXML легкий? Сколько килобайт он добавляет к исполняемому файлу? Alex Jenter
Весь мой .exe составляет около 350 Кб, так что, думаю, я захочу найти что-нибудь более легкое ... но все равно спасибо Alex Jenter
Если вы используете динамическую библиотеку (общая библиотека UNIX / DLL DLL Windows), то ответ - «нет». Просто быстрая проверка на моем Linux-боксе показывает, что разделяемая библиотека имеет размер 1,2 МБ, а статическая библиотека (для компиляции в программы) - 1,5 МБ. Поэтому, если вы сделали статическую компиляцию, вы бы добавили 1.5M-иш в ваш exe-файл.
1

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

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

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

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

Отредактированная ссылка наgithub.com/thinlizzy/die-xml
-1

я очень рекомендуюpugixml

pugixml - это легкая библиотека обработки C ++ XML.

"pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface variants and conversions between different Unicode encodings."

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

Вопрос задан для парсера SAX. На самом деле не реально загружать очень большие файлы XML в структуру DOM.
2

http://sourceforge.net/projects/wsdlpull  это прямой c ++ порт Java API xmlpull (http://www.xmlpull.org/)

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

Я думаю, что синтаксический разбор является намного более интуитивным, чем что-то вроде SAX. Код гораздо более точно отражает документ XML, что позволяет легко соотнести их.

Единственным недостатком является то, что это только вперед, а это означает, что вам нужно анализировать элементы по мере их поступления. У нас довольно запутанный дизайн для чтения наших конфигурационных файлов, и мне нужно проанализировать целое поддерево, сделать несколько проверок, затем установить некоторые значения по умолчанию и снова проанализировать. С помощью этого синтаксического анализатора единственный реальный способ обработки чего-либо подобного - это сделать копию состояния, проанализировать его и затем продолжить работу с оригиналом. Это все равно заканчивается большой победой с точки зрения ресурсов по сравнению с нашим старым DOM-парсером.

Насколько я могу судить, он не поддерживает Unicode? Alex Jenter
Он анализирует символ за раз и использует int для символа. Для элемента имена атрибута он имеет довольно ограничительное определение того, что является допустимым идентификатором (в основном ascii), но, вероятно, для его изменения не потребуется много времени. Он поставляется с проектом, который выполняет тест синтаксического анализа / сериализации, так что довольно просто запустить его на некоторых репрезентативных данных, чтобы опробовать его.
Спасибо за ответ, я посмотрю на него Alex Jenter
0

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

1

Если ваша структура XML очень проста, вы можете подумать о создании простого лексера / сканера на основе lex / yacc (flex / bison). Источники в W3C могут вдохновить вас:http://www.w3.org/XML/9707/parser.y а такжеhttp://www.w3.org/XML/9707/scanner.l.

Смотрите такжеSAX2 интерфейс в libxml

6

Мне нравится ExPat
http://expat.sourceforge.net/

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

4

RapidXML довольно быстрый парсер для XML, написанный на C ++.

Это анализатор DOM, но он анализирует «in-situ», т. Е. Изменяет исходные данные XML, поэтому вам нужно загрузить все данные.
Сбои на Android. Не могу использовать исключения
1

firstobject & APOS; sCMarkup является классом C ++, который работает как облегченный парсер извлечения больших файлов (я рекомендую парсер извлечения, а не SAX), а также для записи больших файлов XML. Это добавляет около 250 КБ к вашему исполняемому файлу. Когда он используется в памяти, он занимает 1/3 объема крошечного файла в отчете одного пользователя. При использовании с огромным файлом он содержит только небольшой буфер (например, 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» для поэтапного перехода по ней.

Похожие вопросы