[c++] 使用Boost读写XML文件


Answers

TinyXML可能是一个不错的选择。 至于Boost:

Boost存储库中有Property_Tree库。 它已被接受,但目前似乎缺乏支持(编辑: Property_Tree现在是版本1.41以来 Boost的一部分,阅读有关其XML功能的文档 )。

Daniel Nuffer为Boost Spirit实现了一个xml解析器

Question

有没有什么好方法(也是一种简单的方法)使用Boost来读写XML文件?

我似乎无法找到使用Boost读取XML文件的任何简单示例。 你能指出一个使用Boost读取和编写XML文件的简单示例吗?

如果不是Boost,是否有任何好的和简单的库来读写您可以推荐的XML文件? (它必须是C ++库)




如果您只是在寻找DOM功能,那么此主题中已有一些建议。 我个人可能不会为缺乏XPath支持的库而烦恼,而在C ++中,会使用Qt。 还有TinyXPath,阿拉比卡声称有XPath支持,但我不能说任何关于这些的东西。




Boost使用RapidXML ,如XML Parser of page 如何填充属性树一章所述:

不幸的是,截至本文撰写时, Boost没有XML解析器。 因此,该库包含快速而小巧的RapidXML解析器(目前版本为1.13),可提供XML解析支持。 RapidXML不完全支持XML标准; 它无法解析DTD,因此无法进行完整的实体替换。

另请参阅XML boost教程

由于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的主页

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);
}



一个警告。 我喜欢RapidXML,但在解析UTF16时它有一个非常讨厌的错误。 某些有效值会导致崩溃。

我很乐意推荐pugixml - 但它缺少名称空间支持,我知道这会给我带来问题。







那么boost.spirit呢?

Here ,他们展示了一个“ Mini XML ”解析器




绝对使用TinyXML *竖起大拇指*




Related



Tags

c++ c++   xml   boost