Использование Boost для чтения и записи XML файлов
Есть ли хороший способ (и простой способ) с помощью Boost для чтения и записи XML файлов?
Я не могу найти простой образец для чтения XML файлов с помощью Boost. Можете ли вы указать мне простой пример, который использует Boost для чтения и записи XML файлов?
Если не Boost, есть ли хорошая и простая библиотека для чтения и записи XML файлов, которые вы можете порекомендовать? (это должна быть библиотека С++)
Ответы
Ответ 1
Вам следует попробовать pugixml Легкий, простой и быстрый XML-парсер для С++
Самое приятное в pugixml - поддержка XPath, которой не хватает TinyXML и RapidXML.
Цитата автора RapidXML "Я хотел бы поблагодарить Арсения Капулкина за его работу над pugixml, которая была вдохновением для этого проекта" и "на 5% - на 30% быстрее, чем pugixml, самый быстрый парсер XML, который я знаю о" Он тестировал " против версии 0.3 pugixml, которая достигла недавно версии 0.42.
Вот выдержка из документации pugixml:
Основные функции:
- низкое потребление памяти и фрагментация (выигрыш над pugxml ~ 1,3 раза, TinyXML - ~ 2,5 раза, Xerces (DOM) - ~ 4,3 раза 1). Точные числа можно увидеть в разделе Сравнение с существующим разделом парсеров.
- чрезвычайно высокая скорость разбора (выигрыш над pugxml ~ 6 раз, TinyXML - ~ 10 раз, Xerces-DOM - ~ 17,6 раза 1
- чрезвычайно высокая скорость синтаксического анализа (ну, я повторяюсь, но это так быстро, что он превосходит Expat в 2.8 раза на тестовом XML) 2
- более или менее стандартно-совместимый (он правильно проанализирует любой стандартный файл, за исключением проблем, связанных с DTD)
- довольно много ошибок (он не задохнется от чего-то вроде You and Me, как exat will, будет анализировать файлы с данными в неправильном кодировании и т.д.)
- чистый интерфейс (сильно рефакторинг pugxml)
- более или менее Unicode-aware (на самом деле он предполагает кодировку UTF-8 входных данных, хотя он будет легко работать с ANSI - без UTF-16 на данный момент (см. "Будущая работа" ), с вспомогательными функциями преобразования (UTF- 8 ↔ UTF-16/32 (что по умолчанию используется для std:: wstring и wchar_t))
- полностью совместимый с С++ код (одобрен строгим режимом Комо); библиотека является мультиплатформенной (см. ссылку для списка платформ).
- высокая гибкость. Вы можете управлять многими аспектами разбора файлов и построения дерева DOM с помощью параметров синтаксического анализа.
Хорошо, вы могли бы спросить - какой улов? Все так мило - это небольшое, быстрое, надежное, чистое решение для синтаксического анализа XML. Чего не хватает? Хорошо, мы честные разработчики - вот список недочетов:
- память потребление. Он превосходит каждый парсер, основанный на DOM, о котором я знаю, но когда приходит парсер SAX, шансов нет. Вы не можете обработать XML файл размером 2 ГБ с объемом памяти менее 4 ГБ - и сделать это быстро. Хотя pugixml ведет себя лучше, чем любой другой парсер, основанный на DOM, поэтому, если вы застряли с DOM, это не проблема.
- память потребление. Хорошо, я повторяюсь. Еще раз. Когда другие синтаксические анализаторы позволят вам предоставить XML файл в постоянном хранилище (или даже в виде области с отображением памяти), pugixml не будет. Таким образом, вам придется скопировать все данные в непостоянное хранилище. Более того, он должен сохраняться во время жизни парсера (причины этого и многое другое о сроках жизни написано ниже). Опять же, если вы в порядке с DOM - это не должно быть проблемой, потому что общее потребление памяти меньше (ну, хотя вам понадобится непрерывный кусок памяти, что может быть проблемой).
- отсутствие проверки, обработка DTD, пространства имен XML, правильная обработка кодировки. Если вам это нужно - возьмите MSXML или XercesC или что-нибудь в этом роде.
Ответ 2
TinyXML, вероятно, является хорошим выбором. Что касается Boost:
Существует библиотека Property_Tree в Boost Repository, Это было принято, но на данный момент поддержки пока не хватает (EDIT: Property_Tree теперь является частью Boost начиная с версии 1.41, прочитайте документацию относительно ее функциональности XML).
Daniel Nuffer внедрил xml parser для Boost Spirit.
Ответ 3
Там также TinyXML, который является хорошей и небольшой библиотекой С++. Если вы ищете библиотеку более низкого уровня, RapidXML - отличная отправная точка.
Ответ 4
Boost использует RapidXML, как описано в глава XML Парсер страницы Как заполнить дерево свойств:
К сожалению, нет XML парсер в Boost на момент написания этой статьи. Поэтому библиотека содержит быстрый и малый RapidXML парсер (в настоящее время версия 1.13), чтобы обеспечить поддержку синтаксического анализа XML. RapidXML не полностью поддерживает стандарт XML; он не способен анализировать DTD и поэтому не может полная подстановка объекта.
Также см. учебное пособие по XML-расширению.
Поскольку OP хочет "простой способ использовать boost для чтения и записи xml файлов", я приведу ниже очень простой пример:
<main>
<owner>Matt</owner>
<cats>
<cat>Scarface Max</cat>
<cat>Moose</cat>
<cat>Snowball</cat>
<cat>Powerball</cat>
<cat>Miss Pudge</cat>
<cat>Needlenose</cat>
<cat>Sweety Pie</cat>
<cat>Peacey</cat>
<cat>Funnyface</cat>
</cats>
</main>
(имена кошек от главная страница Matt Mahoney)
Соответствующая структура в С++:
struct Catowner
{
std::string owner;
std::set<std::string> cats;
};
read_xml()
использование:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
Catowner load(const std::string &file)
{
boost::property_tree::ptree pt;
read_xml(file, pt);
Catowner co;
co.owner = pt.get<std::string>("main.owner");
BOOST_FOREACH(
boost::property_tree::ptree::value_type &v,
pt.get_child("main.cats"))
co.cats.insert(v.second.data());
return co;
}
write_xml()
использование:
void save(const Catowner &co, const std::string &file)
{
boost::property_tree::ptree pt;
pt.put("main.owner", co.owner);
BOOST_FOREACH(
const std::string &name, co.cats)
pt.add("main.cats.cat", name);
write_xml(file, pt);
}
Ответ 5
Ну, нет никакой конкретной библиотеки в boost для синтаксического анализа XML, но есть много альтернатив, вот пара:
libxml,
Xerces,
Expat
Конечно, вы могли бы использовать некоторые из других библиотек в boost, чтобы помочь вам в создании собственной библиотеки, но это, вероятно, будет довольно серьезной задачей.
И вот целая статья по этому вопросу от IBM.
Ответ 6
Boost не предоставляет АТМ XML-анализатора.
Poco XML (часть Poco С++ libs) хороша и проста.
Ответ 7
Похоже, что сериализация boost может читать и записывать в архивы в XML, если это достаточно для ваших целей.
Простой XML с Boost
Ответ 8
Определенно использовать TinyXML * thumbs up *
Ответ 9
Взгляните на Arabica
Ответ 10
Если вы ищете только функцию DOM, в этом потоке есть несколько предложений. Я лично, вероятно, не потрудился бы с библиотекой, не имеющей поддержки XPath, и на С++ использовал Qt. Там также TinyXPath, и Arabica утверждает, что поддерживает XPath, но я ничего не могу сказать о них.
Ответ 11
Из моих впечатлений, скрывающихся в списке рассылки Boost, кажется, что каждый раз, когда XML появляется в качестве темы, он отвлекается на обсуждение Unicode. Однако, поскольку в настоящее время существует потенциальная библиотека Unicode, я не думаю, что для библиотеки XML появится слишком много времени.
Тем временем я тоже использовал TinyXML.
Интересная ссылка о RapidXML. Я посмотрю на это.
Ответ 12
Предупреждение. Мне нравится RapidXML, но при разборе UTF16 у него очень неприятная ошибка. Некоторые допустимые значения приводят к сбою.
Мне бы хотелось порекомендовать pugixml - но ему не хватает поддержки пространства имен, которое, как я знаю, вызовет у меня проблемы.
Ответ 13
Существует предлагаемая GSoC работа по улучшению существующего предложения Boost.XML: https://github.com/stefanseefeld/boost.xml, но поскольку Andrzej предложил Boost.PropertyTree, это приятно для этой задачи. В зависимости от размера xml и необходимой поддержки валидации.
Существует также библиотека, которая недавно была предложена в списке рассылки Boost:
http://www.codesynthesis.com/projects/libstudxml/doc/intro.xhtml
Ответ 14
Как насчет boost.spirit?
Здесь, они показывают парсер Mini XML