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,可以隨時聯繫博主或者留言,博主會第一時間進行修正。如果本文對你有幫助,請點贊支持,謝謝關注。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章