2009-06-17 3 views
8

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

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

Я знаю о Xerces, но его размер размером более 50 мб дает мне дрожь.

Спасибо!

+0

http://stackoverflow.com/questions/170686/best-open-xml-parser-for-c – bobobobo

+1

Вы посмотрели vtd-xml? –

ответ

7

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

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

+0

Спасибо за ответ. Является ли LibXML легким? Сколько кбайтов оно добавляет к исполняемому файлу? –

+0

Если вы используете динамическую библиотеку (UNIX shared lib/Windows DLL), тогда ответ будет «none». Просто быстрая проверка на моем Linux-боксе показывает, что общая библиотека - это 1.2M, а статическая библиотека (которая будет использоваться при компиляции в программы) - 1.5M. Поэтому, если вы сделали статический компилятор, вы бы добавили 1.5M-ish к вашему exe. –

+0

Весь мой .exe составляет около 350Kb, поэтому, я думаю, я захочу найти что-то более легкое .. но спасибо в любом случае –

2

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

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

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

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

+1

Насколько я могу судить, это не поддерживает Unicode? –

+0

Он анализирует персонаж за раз и использует int для персонажа. Для элемента имен атрибутов он имеет довольно ограничительное определение того, что является действительным идентификатором (в основном ascii), но, вероятно, не потребуется многого для его изменения. Он поставляется с проектом, который выполняет анализ синтаксиса/сериализации, поэтому довольно легко запустить его через некоторые репрезентативные данные, чтобы попробовать его. – Dolphin

+0

Спасибо за ответ, я рассмотрю его –

0

Я бы посмотрел на инструменты, которые вам нужны, если вы хотите малых и быстрых. Они очень хороши для огромных документов.

1

firstobject's CMarkup - это класс C++, который работает как легкий громоздкий анализатор файлов (я рекомендую синтаксический анализатор вместо SAX) и огромный писатель XML-файлов. Он добавляет до 250 кб вашему исполняемому файлу. При использовании в памяти он имеет 1/3 отпечатка tinyxml по одному отчету пользователя. При использовании в огромном файле он содержит только небольшой буфер (например, 16 КБ) в памяти. 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, чтобы пройти через него по строкам.

4

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

+0

Сбой на Android. Невозможно использовать Исключения –

+1

Это парсер DOM, но он анализирует «in-situ», то есть изменяет исходные XML-данные, поэтому вам нужно загрузить все данные. – Nick

1

Вы можете попробовать http://die-xml.googlecode.com/. это, кажется, очень маленький и легкий в использовании

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

разборе входного потока и генерирует события на обратных вызовов, совместимых с станд :: функция

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

-1

Я настоятельно рекомендую 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 

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

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

+0

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

Смежные вопросы