boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的。但是在使用过程中却发现各种不好用,归纳一下不好用的地方有这些:
获取不存在的节点时就抛出异常
获取属性值时,要排除属性和注释节点,如果没注意这一点就会抛出异常,让人摸不着头脑。
内存模型有点怪。
默认不支持中文的解析。解析中文会乱码。
ptree获取子节点
获取子节点接口原型为get_child(node_path),这个node_path从当前路径开始的全路径,父路径和子路径之间通过“.”连接,如“root.sub.child”。需要注意的是get_child获取的是第一个子节点,如果我们要获取子节点列表,则要用路径“root.sub”,这个路径可以获取child的列表。如果获取节点的路径不存在则会抛出异常,这时,如果不希望抛出异常则可以用get_xxx_optional接口,该接口返回一个optional的结果出来,由外面判断是否获取到结果了。
//ptree的optional接口
auto item = root.get_child_optional("Root.Scenes");
该接口返回的是一个optional,外面还要判断该节点是否存在,optional对象通过bool操作符来判断该对象是否是无效值,通过指针访问
符"*"来访问该对象的实际内容。建议用optional接口访问xml节点。
//ptree的optional接口
auto item = root.get_child_optional("Root.Scenes");if(item)
cout<
ptree的内存模型
ptree维护了一个pair的子节点列表,first指向的是该节点的TagName,second指向的才是ptree节点,因此在遍历ptree子节点时要注意迭代器的含义。
for (auto&data : root)
{for (auto& item : data.second) //列表元素为pair,要用second继续遍历
{
cout<
}
}
需要注意的是ptree.first可能是属性("")也可能是注释(""),只有非注释类型的节点才能使用获取属性值、子节点等常用接口。
ptree获取属性值
通过get(attr_name)可以获取属性的值,如果想获取属性的整形值的话,可以用get("Id"),返回一个整数值。有一点要注意如果ptree.first为""时,是没有属性值的,可以通过data()来获取注释内容。如果这个ptree.first不为时需要在属性名称前面加".",即get(".Id")才能正确获取属性值。可以看到获取属性值还是比较繁琐的,在后面要介绍的帮助类中可以简化属性值的获取。如果要获取节点的值则用get_value()接口,该接口用来获取节点的值,如节点:2通过get_value()就可以获取值"2"。
解析中文的问题</