有没有什么好方法(也是一种简单的方法)使用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文档的摘录:
主要特点是:
好的,你可能会问 - 捕获的是什么?一切都很可爱 - 它是解析XML的小巧,快速,强大,干净的解决方案.缺什么?好的,我们是公平的开发人员 - 所以这里是一个错误列表:
ste*_*han 23
TinyXML可能是一个不错的选择.至于Boost:
Boost存储库中有Property_Tree库.它已被接受,但目前似乎缺乏支持(编辑:Property_Tree现在是版本1.41以来的Boost的一部分,阅读有关其XML功能的文档).
Daniel Nuffer 为Boost Spirit 实现了一个xml解析器.
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)