boost读取xml文件

  • Post author:
  • Post category:其他


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 版权协议,转载请附上原文出处链接和本声明。