Какой лучший синтаксический анализатор открытого XML для C++?
Я ищу простой, чистый, правильный анализатор XML для использования в моем проекте C++. Должен ли я написать свой собственный?
12 ответов
Как насчет 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
pugixml - легкий, простой и быстрый парсер XML для C++. Очень маленький (сравнимый с RapidXML), очень быстрый (сравнимый с RapidXML), очень простой в использовании (лучше, чем RapidXML).
TiCPP - это версия TinyXML с более "с ++".
"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+.
Попробуйте это: http://www.applied-mathematics.net/tools/xmlParser.html
это проще и быстрее, чем RapidXML или PUGXML.
TinyXML - худший из "простого парсера".
Не используйте TinyXML, если вы беспокоитесь об эффективности / управлении памятью (он имеет тенденцию выделять много маленьких блоков). Мой личный фаворит - RapidXML.
Как насчет 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
Объявление класса выше для генерации soap_read_Address
а также soap_write_Address
Читатель и писатель XML, например:
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++, включая основанные на указателе связанные структуры и даже (циклические) графы (а не только деревья).
Надеюсь это поможет.
TinyXML, а также Boost.PropertyTree. Последний не соответствует всем официальным требованиям, но очень прост.
Я новичок в C++ и, попробовав несколько разных предложений на этой странице, должен сказать, что мне больше всего нравится pugixml. Он имеет легкую для понимания документацию и API высокого уровня, и это было все, что я искал.
TinyXML может быть лучше для простой работы с XML, но если вам нужно больше возможностей, попробуйте Xerces из проекта apache. Перейдите на следующую страницу, чтобы узнать больше о его функциях.
Мне нравится XML-парсер Gnome. Он с открытым исходным кодом (лицензия MIT, поэтому вы можете использовать его в коммерческих продуктах), быстрый и имеет интерфейсы на основе DOM и SAX.