使用boost属性树检查xml文件中是否存在元素

时间:2018-03-14 14:06:54

标签: c++ xml boost-propertytree

我正在使用以下类型的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()函数吗?

1 个答案:

答案 0 :(得分:0)

查看find()

的文档
  

assoc_iterator find(const key_type&amp; key);
  34.找到具有给定键的子项,如果没有,则查找not_found()。如果多个孩子拥有相同的密钥,则无法保证返回哪个孩子。

get_child()

  

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