递归获取提升属性树中所有值的完整关键路径

Posted

技术标签:

【中文标题】递归获取提升属性树中所有值的完整关键路径【英文标题】:recursively get complete key path to all values in a boost property tree 【发布时间】:2021-02-12 14:23:33 【问题描述】:

我正在将一个 XML 文件读入 boost::property_tree 并尝试获取每个值的完整键路径。

    boost 是否有内置方法来执行此操作 是我的递归出错了吗?

示例输入 - my_file.xml

<foo>
    <bar>abc</bar>
    <baz>
        <buz>def</buz>
    </baz>
</foo>

想要的结果

"foo.bar"
"foo.baz.buz"

实际结果(错误)

"foo.bar"
"foo.bar.baz.buz"

无法正常工作的代码

void walk_ptree(boost::property_tree::ptree tree, std::unordered_set<std::string>& key_set, std::string parent_key)

    if (tree.empty())
    
        key_set.insert(parent_key);
        return;
    
    for (auto& it : tree)
    
        // add a separator between key segments
        if (!parent_key.empty())
        
            parent_key += ".";
        
        parent_key += it.first;
        walk_ptree(it.second, key_set, parent_key);
    


boost::property_tree::ptree prop_tree;
boost::property_tree::read_xml("my_file.xml", prop_tree);
std::unordered_set<std::string> key_set;
walk_ptree(prop_tree, key_set, "");

【问题讨论】:

我希望你知道如何使用调试器来单步调试你的代码。它消除了提出这样一个问题的需要。干杯 【参考方案1】:

for 循环的每次迭代都会添加到 parentKey 值,因此在循环结束时它将包含所有子项的名称。使用单独的变量来保存每个节点的键名:

void walk_ptree(const boost::property_tree::ptree& tree, std::unordered_set<std::string>& key_set, const std::string& parent_key)

    if (tree.empty())
    
        key_set.insert(parent_key);
        return;
    
    for (auto& it : tree)
    
        std::string key = parent_key;
        // add a separator between key segments
        if (!key.empty())
        
            key += ".";
        
        key+= it.first;
        walk_ptree(it.second, key_set, key);
    

【讨论】:

以上是关于递归获取提升属性树中所有值的完整关键路径的主要内容,如果未能解决你的问题,请参考以下文章

打印python嵌套字典的所有值的完整键路径

unity路径途径有几个关键帧

二叉树中某一值的路径之 先序遍历 + 二叉搜索树转化为循环双向链表 之 中序遍历

c语言中如何获取树中所有叶子节点的路径

在二元树中找出和为某一值的所有路径

python3实现在二叉树中找出和为某一值的所有路径