it-swarm.com.ru

Какой лучший синтаксический анализатор открытого XML для C ++?

Я ищу простой, чистый, правильный анализатор XML для использования в моем проекте C++. Должен ли я написать свой собственный?

239
whaledawg

Как насчет RapidXML ? RapidXML - это очень быстрый и небольшой анализатор XML DOM, написанный на C++. Он предназначен в первую очередь для встраиваемых сред, компьютерных игр или любых других приложений, где доступная память или процессорная мощность имеют первостепенное значение. RapidXML лицензируется в рамках Boost Software License, и его исходный код находится в свободном доступе.

Особенности

  • Скорость синтаксического анализа (включая построение дерева DOM) приближается к скорости функции strlen, выполняемой для тех же данных.
  • На современном процессоре (по состоянию на 2008 г.) пропускная способность синтаксического анализатора составляет около 1 миллиарда символов в секунду. См. Раздел "Производительность" в онлайн-руководстве.
  • Небольшой объем памяти кода и созданных деревьев DOM.
  • Реализация только для заголовков, упрощающая процесс интеграции.
  • Простая лицензия, позволяющая использовать ее практически в любых целях, как коммерческих, так и некоммерческих, без каких-либо обязательств.
  • Поддерживает кодировки UTF-8 и частично UTF-16, UTF-32.
  • Переносимый исходный код без каких-либо зависимостей, кроме очень небольшого подмножества стандартной библиотеки C++.
  • Это подмножество настолько мало, что его легко эмулировать вручную, если использование стандартной библиотеки нежелательно.

Ограничения

  • Парсер игнорирует объявления DOCTYPE.
  • Нет поддержки пространств имен XML.
  • Парсер не проверяет правильность символов.
  • Интерфейс парсера не соответствует спецификации DOM.
  • Парсер не проверяет уникальность атрибута.

Источник: wikipedia.org http://Rapidxml


В зависимости от того, что вы используете, вы можете использовать привязку данных XML? CodeSynthesis XSD - это компилятор привязки данных XML для C++, разработанный Code Synthesis и имеющий двойную лицензию под GNU GPL и проприетарная лицензия. Учитывая спецификацию экземпляра XML (XML Schema), он генерирует классы C++, которые представляют данный словарь, а также код синтаксического анализа и сериализации.

Одной из уникальных особенностей CodeSynthesis XSD является его поддержка двух различных отображений XML-схемы на C++: C++/Tree в памяти и потоково-ориентированный C++/Parser. C++/Tree mapping - это традиционное отображение с древовидной структурой данных в памяти. C++/Parser - это новое SAX-подобное отображение, которое представляет информацию, хранящуюся в экземплярах XML-документов, в виде иерархии событий синтаксического анализа, характерных для словаря. По сравнению с C++/Tree отображение C++/Parser позволяет обрабатывать большие XML-документы, которые не помещаются в памяти, выполнять потоковую обработку или использовать существующее представление в памяти.

Источник: wikipedia.org http://CodeSynthesis XSD

118
jk.

pugixml - Легкий, простой и быстрый синтаксический анализатор XML для C++ Очень маленький (сравнимый с RapidXML), очень быстрый (сравнимый с RapidXML), очень простой в использовании ( лучше чем RapidXML).

97
Zbyl

Попробуйте TinyXML.

http://sourceforge.net/projects/tinyxml

40
Rob

TiCPP является версией TinyXML с более "c ++".

"TiCPP" - это сокращение от официального названия TinyXML ++. Это совершенно новый интерфейс для TinyXML ( http://www.grinninglizard.com/tinyxml/ ), который использует МНОГО сильных сторон C++. Шаблоны, исключения и намного лучшая обработка ошибок. Это также полностью зарегистрировано в doxygen. Это действительно круто, потому что эта версия позволяет вам интерфейс крошечный точно так же, как и раньше, или вы можете использовать новые классы 'ticpp'. Все, что вам нужно сделать, это определить TIXML_USE_TICPP. Он был протестирован в VC 6.0, VC 7.0, VC 7.1, VC 8.0, MinGW gcc 3.4.5 и в Linux. GNU gcc 3+

16
Kasprzol

попробуйте это: http://www.applied-mathematics.net/tools/xmlParser.html
это проще и быстрее, чем RapidXML или PUGXML.
TinyXML - худший из "простого парсера".

14
Kat

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

12
yrp

Как насчет gSOAP ? Это с открытым исходным кодом и свободно доступны под лицензией GPL. Несмотря на свое название, инструментарий gSOAP является универсальным инструментом связывания данных XML и позволяет автоматически связывать данные C и C++ с XML. Нет необходимости использовать API синтаксического анализатора XML, просто позвольте ему читать/записывать ваши данные в формате XML для вас. Если вам действительно нужен супер-простой синтаксический анализатор C++ XML, тогда gSOAP может оказаться излишним. Но во всем остальном он работал хорошо, как показывают отзывы для многих промышленных приложений с момента появления gSOAP в 2001 году.

Вот краткий список возможностей:

  • Портативный: Windows, Linux, Mac OS X, Unix, VxWorks, Symbian, Palm OS, WinCE и т.д.
  • Небольшая площадь: код 73 КБ и данные менее 2 КБ для реализации клиентского приложения веб-службы XML (без DOM для ограничения использования памяти).
  • Быстро: не верьте тому, что утверждают другие инструменты, истинную скорость следует измерять с помощью ввода/вывода. Для gSOAP это более 3000 двусторонних XML-сообщений по TCP/IP. Затраты на синтаксический анализ XML незначительны, так как это простое линейное сканирование ввода/вывода, когда происходит (де) сериализация.
  • Поддержка XML: импорт/экспорт схемы XML (XSD), импорт/экспорт WSDL, пространства имен XML, канонизация XML, XML с вложениями (MIME), необязательное использование DOM, множество опций для создания XML с отступами, использование строк UTF8 и т.д.
  • Проверка XML: частичная и полная (опция)
  • Поддержка WS: WS-Security, WS-ReliableMessaging, WS-Addressing, WS-Policy, WS-SecurityPolicy и другие.
  • Отладка: интегрированное управление памятью с обнаружением утечек, ведение журнала.
  • API: API не нужно изучать, только инициализация контекста движка "мыло", затем используйте интерфейс чтения/записи для ваших данных и уничтожение контекста движка "мыло".

Например:

class Address
{ 
  std::string name;
  std::vector<LONG64> number;
  time_t date;
};

Затем запустите "soapcpp2" в приведенном выше объявлении класса Address, чтобы сгенерировать средство чтения и записи XML soap_read_Address и soap_write_Address, например:

Address *a = new Address();
a = ...;
soap ctx = soap_new();
soap_write_Address(ctx, a);
soap_end(ctx);
soap_free(ctx);`

Это создает XML-представление объекта Address a. Аннотируя объявления файла заголовка деталями пространства имен XML (здесь не показано), инструменты также генерируют схемы. Это простой пример. Инструменты gSOAP могут обрабатывать очень широкий диапазон типов данных C и C++, включая основанные на указателе связанные структуры и даже (циклические) графы (а не только деревья).

Надеюсь это поможет.

10
Bob

Я новичок в C++ и, попробовав несколько разных предложений на этой странице, должен сказать, что мне больше нравится pugixml . Он имеет легкую для понимания документацию и API высокого уровня, и это было все, что я искал.

9
godspeedelbow

TinyXML может быть лучше для простой работы с XML, но если вам нужно больше возможностей, попробуйте Xerces из проекта Apache. Перейдите на следующую страницу, чтобы узнать больше о его функциях.

http://xerces.Apache.org/xerces-c/

9
Raminder

TinyXML, а также Boost.PropertyTree. Последний не соответствует всем официальным требованиям, но очень прост.

8
Lev

Мне нравится парсер Gnome xml. Он с открытым исходным кодом (лицензия MIT, поэтому вы можете использовать его в коммерческих продуктах), быстрый и имеет интерфейсы на основе DOM и SAX.

http://xmlsoft.org/

7
dicroce

Попробуйте TinyXML или IrrXML ... Оба являются легковесными парсерами XML (в любом случае, я бы посоветовал вам использовать TinyXML).

2
Prog