有没有什么好的方法(和过于简单的方式)使用Boost读写XML文件?
我似乎无法找到任何简单的示例使用Boost读取XML文件。 你能指出我使用升压用于读取和写入XML文件的一个简单的示例?
如果不提升,有没有什么好的和简单的库来读写,你可以推荐XML文件? (它必须是一个C ++库)
有没有什么好的方法(和过于简单的方式)使用Boost读写XML文件?
我似乎无法找到任何简单的示例使用Boost读取XML文件。 你能指出我使用升压用于读取和写入XML文件的一个简单的示例?
如果不提升,有没有什么好的和简单的库来读写,你可以推荐XML文件? (它必须是一个C ++库)
你应该尝试pugixml 重量轻,对C简单快速的XML解析器++
关于pugixml的最好的事情是XPath支持,这TinyXML的和RapidXML缺乏。
引用RapidXML的作者“我要感谢Arseny Kapoulkine为他的pugixml工作,这是这个项目的灵感”和“5% - 比pugixml快30%,最快的XML解析器,我知道。”他曾经对0.3版进行测试的pugixml,这已经达到了最近版本0.42。
下面是从pugixml文件的摘录:
其主要特点是:
好吧,你可能会问 - 有什么收获? 一切都是那么的可爱 - 这是小型,快速,稳健,干净解析XML解决方案。 缺什么? 好吧,我们是公平的开发商 - 所以这里是一个不好的特性列表:
TinyXML的可能是一个不错的选择。 至于提升:
还有就是Property_Tree库升压库 。 它已被接受,但支持似乎缺乏的时刻(编辑: Property_Tree现在是加速的一部分,因为1.41版本 ,阅读文档有关XML功能)。
丹尼尔Nuffer实行的是XML解析器的升压精神。
还有TinyXML的 ,这是一个很好的和小的C ++库。 如果你正在寻找一个低级别的图书馆, RapidXML是一个很好的起点。
升压使用RapidXML在描述如何填充属性树页的章节XML解析器 :
不幸的是,有没有XML解析器升压为写这篇文章的时间。 因此,该库包含了快速和微小RapidXML解析器(目前在1.13版本)提供XML解析的支持。 RapidXML不完全支持XML标准; 它不能解析的DTD,因此不能做全部的实体取代。
还请参阅XML升压教程 。
由于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>
(猫名与马特·马奥尼的主页 )
在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);
}
那么有升压XML解析没有具体的图书馆,但也有很多的选择,这里有一对夫妇: libxml的 , Xerces的 , 外籍人士
当然,你可以使用一些其他的图书馆在提升,以帮助您制作自己的图书馆,但很可能会相当的承诺。
这里是整个文章由IBM的主题。
升压不提供XML解析器大气压。
POCO XML(的部分POCO C ++库 )是良好的和简单的。
这样看来,升压序列化可以读取和写入到档案中的XML,如果这是足以满足您的目的。
更简单的XML与升压
Definatelly使用TinyXML的*竖起大拇指*
看看阿拉比卡
如果你正在寻找只是DOM的功能,也有一些建议已经在这个线程。 我个人可能不会有一个图书馆缺乏XPath支持打扰,并在C ++中,将使用Qt。 还有TinyXPath和阿拉比卡声称拥有XPath支持,但我不能说任何关于这些。
从我的经验,潜伏在Boost邮件列表上,似乎每一次XML来了作为一门学科,它被转移到一个关于Unicode的讨论。 然而,由于存在潜在的Unicode库,现在迫在眉睫的,我不认为这会花费太长的时间为一个XML库出现在那里。
在此期间,我也有使用TinyXML的过。
约RapidXML有趣的联系。 我会看看那个。
一个警告。 我爱RapidXML,但分析UTF16时,它有一个很讨厌的错误。 原因是一些有效值崩溃。
我很想推荐pugixml - 但它缺乏命名空间的支持,我知道是要引起我的问题。
有一个编程之夏建议工作,提高Boost.XML的现有提案: https://github.com/stefanseefeld/boost.xml但安杰提出Boost.PropertyTree是这个任务很好。 根据不同的XML大小和所需的验证支持自然。
还有这是最近在加速通讯录提出了一个库: http://www.codesynthesis.com/projects/libstudxml/doc/intro.xhtml
什么boost.spirit?
在这里 ,他们表现出一种“ 迷你XML”解析器
<?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;
}