Облегченный парсер XML, эффективный для больших файлов? - PullRequest
8 голосов
/ 17 июня 2009

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

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

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

Спасибо!

Ответы [ 9 ]

7 голосов
/ 17 июня 2009

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

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

6 голосов
/ 17 июня 2009

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

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

4 голосов
/ 24 января 2010

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

2 голосов
/ 17 июня 2009

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

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

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

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

1 голос
/ 23 ноября 2011

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

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

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

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

1 голос
/ 28 сентября 2009

firstobject's CMarkup - это класс 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», чтобы шаг за шагом пройти по ней.

1 голос
/ 17 июня 2009

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

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

0 голосов
/ 09 июня 2016

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

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

"pugixml - это библиотека обработки C ++ XML, которая состоит из 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. Некоторые парсеры просто пожирают драгоценную память!

0 голосов
/ 04 сентября 2009

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

...