xml文件讀取概述
前面兩篇文章對boost讀寫ini和json做了總結,本文將對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讀寫常見配置文件 ini 、json 、xml 的方式。boost中,命名空間property_tree中basic_ptree提供了核心功能,操作類似stl中的list等容器,提供了迭代器、屬性樹等功能, basic_ptree有兩個重要的類型self_type和value_type。self_type是basic_ptree模板實例化後自身的類型,也是子節點的類型。value_type是節點的數據結構,它是一個std::pair,它含有屬性名(first)和節點自身(second),同時支持迭代器遍歷。
通常使用預定義的typedef類型,不直接適用basic_ptree。如ptree、wptree、iptree、wiptree。前綴i表示忽略大小寫,前綴w表示支持寬字符。
文章是博主學習期間總結的學習筆記,剛開始學習,從源碼逐行閱讀,理解上可能有偏差,如果在閱讀中發現錯誤或bug,可以隨時聯繫博主或者留言,博主會第一時間進行修正。如果本文對你有幫助,請點贊支持,謝謝關注。