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,可以随时联系博主或者留言,博主会第一时间进行修正。如果本文对你有帮助,请点赞支持,谢谢关注。