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

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

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

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

Ответы [ 15 ]

1 голос
/ 01 апреля 2014

GSoC предлагает работу по улучшению существующего предложения Boost.XML: https://github.com/stefanseefeld/boost.xml, но, как Анджей предложил, Boost.PropertyTree хорош для этой задачи. Естественно, в зависимости от размера xml и необходимой поддержки валидации.

Существует также библиотека, которая была недавно предложена в списке рассылки Boost: http://www.codesynthesis.com/projects/libstudxml/doc/intro.xhtml

1 голос
/ 04 января 2011

Предупреждение. Я люблю RapidXML, но у него очень неприятная ошибка при разборе UTF16. Некоторые допустимые значения вызывают его сбой.

Я бы с удовольствием порекомендовал pugixml - но в нем отсутствует поддержка пространства имен, что, как я знаю, вызовет у меня проблемы.

1 голос
/ 25 июня 2009

Из моего опыта, скрывающегося в списке рассылки Boost, кажется, что каждый раз, когда XML выступает в качестве темы, он отвлекается на обсуждение Unicode. Однако, поскольку в настоящий момент существует потенциальная библиотека Unicode, я не думаю, что для появления там библиотеки XML потребуется слишком много времени.

Тем временем я тоже использовал TinyXML.

Интересная ссылка о RapidXML. Я посмотрю на это.

0 голосов
/ 05 июля 2018
<?xml version="1.0"?>
<Settings>
  <GroupA>
      <One>4</One>
      <Two>7</Two>
      <Three>9</Three> 
  </GroupA>
  <GroupA>
      <One>454</One>
      <Two>47</Two>
      <Three>29</Three> 
  </GroupA>
  <GroupB>
      <A>String A</A>
      <B>String B</B>  
  </GroupB>  
</Settings>

Существует простой способ чтения XML с помощью BOOST. Этот пример основан на std :: wstring:

#include <string> 
#include <boost/property_tree/xml_parser.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/foreach.hpp>

bool CMyClass::ReadXML(std::wstring &full_path)
{
    using boost::property_tree::wptree;

    // Populate tree structure pt:
    wptree pt;
    std::wstringstream ss; ss << load_text_file(full_path); // See below for ref.
    read_xml(ss, pt);

    // Traverse pt:
    BOOST_FOREACH(wptree::value_type const& v, pt.get_child(L"Settings"))
    {
        if (v.first == L"GroupA")
        {
            unsigned int n1 = v.second.get<unsigned int>(L"One");
            unsigned int n2 = v.second.get<unsigned int>(L"Two");
            unsigned int n3= v.second.get<unsigned int>(L"Three");
        }
        else if (v.first == L"GroupB")
        {
            std::wstring wstrA = v.second.get<std::wstring>(L"A");
            std::wstring wstrB = v.second.get<std::wstring>(L"B");
        }
    };
}

Читать атрибуты немного сложнее.

-

Только для справки:

std::wstring load_text_file(std::wstring &full_path)
{
    std::wifstream wif(full_path);

    wif.seekg(0, std::ios::end);
    buffer.resize(wif.tellg());
    wif.seekg(0);
    wif.read(buffer.data(), buffer.size());

    return buffer;
}
0 голосов
/ 21 апреля 2012

А как насчет boost.spirit?

Здесь , они показывают " Mini XML " парсер

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