Использование Boost для чтения и записи файлов XML - PullRequest
68 голосов
/ 25 июня 2009

Есть ли хороший способ (и тоже простой способ) использовать Boost для чтения и записи файлов XML?

Кажется, я не могу найти простой пример для чтения файлов XML с помощью Boost. Можете ли вы указать мне простой пример, который использует Boost для чтения и записи файлов XML?

Если не Boost, есть ли хорошая и простая библиотека для чтения и записи файлов XML, которую вы можете порекомендовать? (это должна быть библиотека C ++)

Ответы [ 15 ]

63 голосов
/ 19 сентября 2009

Вы должны попробовать pugixml Легкий, простой и быстрый парсер XML для C ++

Самое приятное в 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 & Me, например expat; он будет анализировать файлы с данными в неправильной кодировке; и т. Д.)
  • чистый интерфейс (сильно переработанный pugxml)
  • более или менее с поддержкой Unicode (на самом деле, он предполагает UTF-8-кодирование входных данных, хотя он будет легко работать с ANSI - пока нет UTF-16 (см. Дальнейшую работу), с функциями вспомогательного преобразования (UTF- 8 <-> UTF-16/32 (независимо от значения по умолчанию для std :: wstring & wchar_t))
  • полностью стандартный код C ++ (одобрен строгим режимом Comeau); библиотека является мультиплатформенной (см. список платформ)
  • высокая гибкость. Вы можете управлять многими аспектами анализа файлов и построения дерева DOM с помощью параметров анализа.

Хорошо, вы можете спросить - в чем прикол? Все так мило - это маленькое, быстрое, надежное, чистое решение для анализа XML. Чего не хватает? Хорошо, мы добросовестные разработчики - вот список с ошибками:

  • потребление памяти. Он превосходит все известные мне DOM-парсеры, но когда приходит SAX-парсер, шансов нет. Вы не можете обработать 2 ГБ XML-файл с объемом памяти менее 4 ГБ - и сделать это быстро. Хотя pugixml ведет себя лучше, чем все другие парсеры на основе DOM, поэтому, если вы застряли с DOM, это не проблема.
  • потребление памяти. Хорошо, я повторяюсь. Снова. Когда другие парсеры позволят вам предоставлять XML-файл в постоянном хранилище (или даже как область отображения памяти), pugixml не будет. Таким образом, вам придется скопировать все данные в непостоянное хранилище. Более того, он должен сохраняться в течение всего времени жизни синтаксического анализатора (причины этого и многое другое о временах жизни написано ниже). Опять же, если вы в порядке с DOM - это не должно быть проблемой, потому что общее потребление памяти меньше (ну, хотя вам понадобится непрерывный кусок памяти, что может быть проблемой).
  • отсутствие проверки, обработка DTD, пространства имен XML, правильная обработка кодировки. Если вам это нужно - возьмите MSXML, XercesC или что-нибудь в этом роде.
23 голосов
/ 25 июня 2009

TinyXML , вероятно, хороший выбор. Что касается повышения:

В репозитории Boost имеется библиотека Property_Tree . Он был принят, но в данный момент поддержка, кажется, отсутствует (EDIT: Property_Tree теперь является частью Boost начиная с версии 1.41 , прочитайте документацию относительно Функциональность XML).

Даниэль Нуффер реализовал xml-парсер для Boost Spirit.

16 голосов
/ 25 июня 2009

Существует также TinyXML , которая представляет собой симпатичную и маленькую библиотеку C ++. Если вы ищете библиотеку более низкого уровня, RapidXML - отличная отправная точка.

10 голосов
/ 28 декабря 2014

Boost использует RapidXML , как описано в главе Анализатор XML страницы Как заполнить дерево свойств :

К сожалению, на момент написания этой статьи XML синтаксический анализатор отсутствует Boost *1019*. Поэтому библиотека содержит быстрый и крошечный синтаксический анализатор RapidXML (в настоящее время версия 1.13) для обеспечения поддержки парсинга XML. RapidXML не полностью поддерживает стандарт XML; он не способен анализировать DTD и поэтому не может делать полная замена сущности.

Пожалуйста, обратитесь к учебнику по XML .

Поскольку ОП хочет "простой способ использовать 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>

(имена кошек с на домашней странице Мэтта Махони )

Соответствующая структура в C ++:

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);
}
4 голосов
/ 13 августа 2010

Может показаться, что расширенная сериализация может считывать и записывать архивы в XML, если этого достаточно для ваших целей.

Упрощенный XML с Boost

4 голосов
/ 25 июня 2009

Boost не предоставляет атм XML-парсера.

Poco XML (часть библиотек Poco C ++ ) хорош и прост.

4 голосов
/ 25 июня 2009

Ну, нет никакой специальной библиотеки для разбора XML, но есть много альтернатив, вот пара: LibXML , Xerces , Expat

Конечно, вы можете использовать некоторые другие библиотеки в boost, чтобы помочь вам создать свою собственную библиотеку, но это, вероятно, будет довольно сложным делом.

А вот целая статья на эту тему от IBM.

3 голосов
/ 25 июня 2009

Определенно используйте TinyXML * палец вверх *

2 голосов
/ 25 июня 2009

Если вы ищете только функциональные возможности DOM, в этой теме уже есть некоторые предложения. Лично я, вероятно, не стал бы беспокоиться о библиотеке, не поддерживающей XPath, а в C ++ использовал бы Qt. Также есть TinyXPath, и Arabica утверждает, что поддерживает XPath, но я ничего не могу сказать о них.

2 голосов
/ 25 июня 2009

Взгляните на Арабика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...