Boost学习之读写xml文件

xml文件读取概述

前面两篇文章对boost读写inijson做了总结,本文将对boost读写xml做一些详细的总结。和前两者一样,boost中命名空间property_tree提供了支持xml的读写操作,同时提供了大量的API方便外部调用。以下将通过示例简单介绍。

构建xml示例

void build_xml()
{
	ptree root; // 构建根节点
	ptree resource, version;

	version.put<int>("Version", 1);  // 创建子节点
	root.add_child("MyXml", version);  // 将子节点添加到根节点下

	ptree student;
	student.put<string>("Name", "zhangsan");
	student.put<int>("Age", 23);
	student.put<string>("Sex", "man");
	student.put<int>("Grade", 2);

	root.add_child("MyXml.Student", student);  // 可以用“根节点.子节点”的方式添加子节点

	ptree course, tnull;
	course.put<string>("Chinese", "runtu");
	course.put<string>("Math", "sin");
	course.add_child("English", tnull);
	root.add_child("MyXml.Course", course);

	// 使用setting参数,保证文件内容样式有缩进有对齐.
	auto setting = boost::property_tree::xml_writer_make_settings<string>('\t', 1);
	//写入文件,把proptrt_tree转换为xml格式
	write_xml("config_xml.xml", root, std::locale(), setting);
}

运行结果:

<?xml version="1.0" encoding="utf-8"?>
<MyXml>
	<Version>1</Version>
	<Student>
		<Name>zhangsan</Name>
		<Age>23</Age>
		<Sex>man</Sex>
		<Grade>2</Grade>
	</Student>
	<Course>
		<Chinese>runtu</Chinese>
		<Math>sin</Math>
		<English/>
	</Course>
</MyXml>

读取xml示例

void readxml()
{
	ptree root; //构建根节点
	try
	{
		read_xml("config_xml.xml", root);
	}
	catch(const std::exception &e)
	{
		std::cout<<e.what()<<endl;
	}
	
	int version = root.get<int>("MyXml.Version");  // 获取指定节点的值
	cout << "Version is " << version << endl;

	ptree student;

	cout << "student" << endl;
	student = root.get_child("MyXml.Student"); // 获取指定节点,迭代遍历输出
	for (boost::property_tree::ptree::iterator it = student.begin(); it != student.end(); ++it)
	{
		cout << "\t" << it->first;
		cout << ":" << it->second.data() << endl;
	}
 }

运行结果
在这里插入图片描述

修改xml示例

void updatexml()
{
	ptree root;
	try
	{
		// 读取xml,必须要用boost::property_tree::xml_parser::trim_whitespace换行以及裁剪空格,否则写入的文件格式会错乱
		read_xml("config_xml.xml", root, boost::property_tree::xml_parser::trim_whitespace);
	}
	catch (const std::exception &e)
	{
		cout << e.what() << endl;
	}


	root.put("MyXml.Version", 2);   //修改Version版本为
	root.put("MyXml.Student.Prov", "beijing");   // 没有Prov节点,将添加新节点Prov
	
	// 设置写入xml的格式,否则格式会错乱,不易于阅读
	boost::property_tree::xml_writer_settings<string> settings = boost::property_tree::xml_writer_make_settings<string>('\t', 1);

	//把property_tree 转为XML文件
	write_xml("config_xml.xml", root, std::locale(), settings);
}

执行结果:

<?xml version="1.0" encoding="utf-8"?>
<MyXml>
	<Version>2</Version>
	<Student>
		<Name>zhangsan</Name>
		<Age>23</Age>
		<Sex>man</Sex>
		<Grade>2</Grade>
		<Prov>beijing</Prov>
	</Student>
	<Course>
		<Chinese>runtu</Chinese>
		<Math>sin</Math>
		<English/>
	</Course>
</MyXml>

写在结尾

周末时间,总结了boost读写常见配置文件 inijsonxml 的方式。boost中,命名空间property_treebasic_ptree提供了核心功能,操作类似stl中的list等容器,提供了迭代器、属性树等功能, basic_ptree有两个重要的类型self_typevalue_typeself_typebasic_ptree模板实例化后自身的类型,也是子节点的类型。value_type是节点的数据结构,它是一个std::pair,它含有属性名(first)和节点自身(second),同时支持迭代器遍历。
通常使用预定义的typedef类型,不直接适用basic_ptree。如ptree、wptree、iptree、wiptree。前缀i表示忽略大小写,前缀w表示支持宽字符。

文章是博主学习期间总结的学习笔记,刚开始学习,从源码逐行阅读,理解上可能有偏差,如果在阅读中发现错误或bug,可以随时联系博主或者留言,博主会第一时间进行修正。如果本文对你有帮助,请点赞支持,谢谢关注。

发布了29 篇原创文章 · 获赞 340 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Marble_ccp/article/details/105476092
今日推荐