使用路径遍历节点并使用 yaml-cpp 更改 YAML 文件中的值

问题描述 投票:0回答:1

我正在尝试使用 yaml-cpp 加载和更改 YAML 文件。

我有一个字符串,它确定 yaml 的路径,例如“node1/node2/node3”,它在“/”处拆分,然后遍历 YAML。

之后,我尝试保存 YAML。

我的问题是,不知何故,YAML 没有按照我希望的方式进行更改。我写了一个最小的例子:

#include <yaml-cpp/yaml.h>
#include <iostream>

int main()
{
    const std::string test_yaml =
    "node1:\n"
    "  node2:\n"
    "    node3:\n"
    "      name: \"somevalue\"";
    
    YAML::Node root = YAML::Load(test_yaml);
    
    std::list<std::string> path;
    path.push_back("node1");
    path.push_back("node2");
    path.push_back("node3");
    
    YAML::Node traverse = root;
    
    for (const std::string &path_element: path)
    {
        traverse = traverse[path_element];
    }
    
    traverse["name"] = "something else";
    
    YAML::Emitter e;
    e << root;
    
    std::cout << e.c_str() << std::endl;
    
    return 0;
}

我期望 YAML 看起来像这样:

node1:
  node2:
    node3:
      name: something else

但结果是:

node2:
  name: something else

我不知道出了什么问题。

上面的代码可以使用

g++ -o yamlex yamlex.cc $(pkg-config --libs --cflags yaml-cpp)

进行编译
c++ yaml yaml-cpp
1个回答
0
投票

为了避免更改节点,请使用

reset
:

for (const std::string &path_element: path)
{
    traverse.reset(traverse[path_element]);
}
© www.soinside.com 2019 - 2024. All rights reserved.