如何使用 yaml-cpp 删除 YAML 文档的节点

Posted

技术标签:

【中文标题】如何使用 yaml-cpp 删除 YAML 文档的节点【英文标题】:How to remove a node of a YAML document with yaml-cpp 【发布时间】:2014-01-09 19:24:15 【问题描述】:

我有一个 YAML 文件,例如:

top:
  names:
    - name: john1
    - name: john2
    - name: john3
    - name: john.doe

现在我必须删除 top/names/name(john.doe)。如何使用 yaml-cpp 实现这一目标?我的代码是:

void deleteNode(string id)

    YAML::Node config = YAML::LoadFile("doc.yaml");
    for (int i = 0; i < config["top"]["names"].size(); i++)
    
        if(config["top"]["names"][i]["name"].as<string>() == id)
        
            config["top"]["names"].remove(config["top"]["names"][i]);
            break;
        
    

deleteNode("john.doe");

这似乎没有任何作用。

【问题讨论】:

【参考方案1】:

由于您正在处理一个序列,因此您必须按其索引删除一个节点:

void deleteNode(string id) 
    YAML::Node config = YAML::LoadFile("doc.yaml");
    YAML::Node names = config["top"]["names"];
    for (int i = 0; i < names.size(); i++) 
        if(names[i]["name"].as<string>() == id) 
            names.remove(i);
            break;
        
    

【讨论】:

【参考方案2】:

从序列中删除节点在 libyaml-cpp 版本 0.6.3 中已修复。如果您的版本比该版本旧,您应该更新到该版本或更高版本。

【讨论】:

以上是关于如何使用 yaml-cpp 删除 YAML 文档的节点的主要内容,如果未能解决你的问题,请参考以下文章

在 yaml-cpp 中是不是可以获取文档中的***键名

如何使用 yaml-cpp 发出复杂的数据结构?

你如何防止 yaml-cpp 解析器删除所有注释?

在 yaml-cpp 中按名称删除节点

从文档中检索 yaml-cpp 中的锚点和别名字符串

是否有适用于 Visual Studio 的 yaml-cpp 的工作示例?