使用Boost读写XML文件

Nun*_*uno 69 c++ xml boost

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

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

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

Cri*_*dam 63

您应该尝试使用pugixml 轻量级,简单快速的XML解析器来实现C++

关于pugixml最好的事情是XPath支持,TinyXML和RapidXML缺乏.

引用RapidXML的作者"我要感谢Arseny Kapoulkine在pugixml上的工作,这是该项目的灵感"并且比pugixml快5%-3%,这是我所知道的最快的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
  • 非常高的解析速度(好吧,我正在重复自己,但速度非常快,它在测试XML上的表现优于Expat 2.8倍)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解析器出现时,没有机会.您无法处理内存小于4 Gb的2 Gb XML文件 - 并且可以快速完成.虽然pugixml比所有其他基于DOM的解析器表现得更好,但是如果你坚持使用DOM,那就不是问题了.
  • 记忆消耗.好的,我在重复自己.再次.当其他解析器允许您在常量存储(或甚至作为内存映射区域)中提供XML文件时,pugixml将不会.因此,您必须将整个数据复制到非常量存储中.此外,它应该在解析器的生命周期中持续存在(其原因和更多关于生命期的内容写在下面).再说一遍,如果你对DOM没问题 - 这应该不是问题,因为整体内存消耗较少(好吧,虽然你需要一块连续的内存,这可能是一个问题).
  • 缺乏验证,DTD处理,XML命名空间,正确处理编码.如果你需要那些 - 请使用MSXML或XercesC或类似的东西.


ste*_*han 23

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

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

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


Ant*_*eru 16

还有TinyXML,这是一个不错的小型C++库.如果您正在寻找一个较低级别的库,RapidXML是一个很好的起点.


oli*_*bre 11

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>
Run Code Online (Sandbox Code Playgroud)

(猫的名字来自Matt Mahoney的主页)

C++中的相应结构:

struct Catowner
{
    std::string           owner;
    std::set<std::string> cats;
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果这足以满足您的目的,那么 boost 序列化似乎可以读取和写入 XML 中的档案。

使用 Boost 简化 XML