Использование 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