boost的property_tree可以用来读取xml文件。用到的类 boost::property_tree::ptree,这个是用来保存解析后的xml数据流的类,解析函数read_xml,这个函数支持
fstream和文件路径两种参数。
获取xml项就要靠最终保存分析结果的ptree类了。
若只是读取用到的成员基本就是两个ptree.get_child和ptree.get。
xml文件:
<Games DefaultGame = "利剑1">
<Group name = "中和游戏">
<child id = "0" name="利剑1"/>
<child id = "1" name="利剑2"/>
</Group>
</Games>
读取代码:
#include <boost/property_tree/ptree.hpp>
#include "boost/property_tree/xml_parser.hpp"
#include <windows.h>
using boost::property_tree::ptree;
int _tmain(int argc, _TCHAR* argv[])
{
ptree pt;
read_xml("GamesList.xml", pt); //解析xml文件到ptree
for (auto& root: pt.get_child("Games")) //遍历Games的子项
{
if (root.first == "<xmlattr>") //循环第一次访问到的是Games本身的属性,boost把自身的属性也当做子节点。</span>
{
std::string defaultGame = root.second.get<std::string>("DefaultGame");
OutputDebugStringA(defaultGame.c_str());
}
if (root.first == "Group") //循环第二次访问到的才是Games节点在xml中显示的子节点。
{
for (auto& x: root.second) //循环遍历Group的子节点
{
if (x.first == "<xmlattr>") //读取Group节点的属性
{
std::string gameGroup = x.second.get<std::string>("name");
OutputDebugStringA(gameGroup.c_str());
std::cout << gameGroup << std::endl;
}
if (x.first == "child") //Games的子节点child
{
std::string sname = x.second.get<std::string>("<xmlattr>.name");//直接获取child节点的属性name
std::cout << sname << std::endl;
//for (auto& y : x.second) //利用循环也可以访问节点本身的属性
//{
//if (y.first == "<xmlattr>")
//{
//std::string sId = y.second.get<std::string>("id");
//std::string sGameName = y.second.get<std::string>("name");
//std::cout << sGameName << std::endl;
//}
//}
}
}
}
}
int wait;
std::cin >> wait;
return 0;
}
xml由子节点和节点属性组成,在利用循环访问节点的子节点时,循环的第一次访问到的是节点本身的属性<xmlattr>,后面的才是该节点的子节点。在boost中节点的属性也被当做子节点来对待,所以节点的属性在循环访问子节点时第一个被访问到。
版权声明:本文为linfengmove原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。