我正在使用以下类型的boost属性树解析XML文件:
<DocName>
<InitCommands>
<OptionalCommands>
<command name="write" address="0x00000000"/>
<command name="write" address="0x00000000"/>
<command name="write" address="0x00000000"/>
</OptionalCommands>
<command name="write" address="0x00000000"/>
<command name="write" address="0x00000000"/>
</InitCommands>
</DocName>
我想检查XML树中是否存在某个元素。以下是我正在使用的代码:
namespace pt = boost::property_tree;
int main (){
pt::ptree prop_tree;
read_xml ("my.xml", prop_tree);
pt::ptree::const_assoc_iterator it;
it = prop_tree.find("DocName.InitCommands.OptionalCommands");
if (it != prop_tree.not_found())
std::cout <<"Optional Options found !" << std::endl;
}
但是,运行此代码会返回
it == prop_tree.not_found()
如果我试图找到我的xml文件的根元素,即
,这是有效的it = prop_tree.find("DocName");
有人可以建议如何使用这个find()函数吗?
答案 0 :(得分:0)
查看find()
assoc_iterator find(const key_type&amp; key);
34.找到具有给定键的子项,如果没有,则查找not_found()。如果多个孩子拥有相同的密钥,则无法保证返回哪个孩子。
self_type&amp; get_child(const path_type&amp; path);
45.让孩子到达给定的路径,或者抛出ptree_bad_path。
我猜,find
正在寻找直接的孩子 - 这可以解释为什么寻找根元素的工作原理 - 而get_child
是用于沿着整个路径前进的。
所以,要么一步一步,例如,
之类的东西it = prop_tree.find("DocName");
it = it->find("InitCommands");
it = it->find("OptionalCommands");
或创建path_type
并改为使用get_child
。