1

我想在 C++ 项目中使用不敏感的 yaml-cpp,因为它完全符合我的需求。但是我想从另一个节点更新一个节点,即正确地将不存在的节点从一种模式添加到另一种模式,或者替换现有节点的现有值。我无法找到如何简单地使用当前界面来做到这一点......

所以我尝试在迭代器上使用一个简单的循环来做到这一点。我发现以下事情在遍历地图节点时不起作用:

if (node_1[it->first]) /*...*/

它没有找到任何节点!因此,对于以标量为键的映射节点,测试if (node_1[it->first.Scalar()]) /*...*/效果很好。我的问题是对序列键做同样的事情。我怎样才能做到这一点?

编辑

以下是 YAML 文档的示例:

---
#Fake entry
Time:   0.1.1.2
ID: 25814
Emitter: Me
Line : {
    orig: 314,
    st: 512
  }
Message : |
    This is a fake error

#More difficult
[0,1,2,3] : my_address
[5, 6, 7, 8] : an_address
...

该文档可以毫无问题地加载到节点中,例如 doc1;我现在想针对另一个 YAML 文档修改一些条目,例如:

---
Comment: what a dummy file!
Emitter: You
[0,1,2,3] : address changed
...

所以我将第二个文档加载到节点 doc2 中,我想用 doc 2 的节点更新 doc1。doc 2 的第一个键不存在于 doc 1 中并且是一个标量,所以我可以做doc1[it->first.Scalar()] = it->second. 第二个键存在,因此相同的指令将更新 doc1,替换与 key 链接的值Emitter。我的问题是我无法成功找到 doc1 中的第三个键,因为它是一个序列。

4

1 回答 1

1

yaml-cpp 不提供节点的通用相等性测试,这就是为什么您的初始解决方案(这将是最好的工作选择)不起作用的原因。

相反,yaml-cpp 依赖于类型相等性测试。例如,node[5]将所有键转换为整数以检查键是否相等;它不会转换5为节点,然后以这种方式检查相等性。这就是为什么您的其他解决方案通常会起作用的原因 - 您的大多数键都是简单的标量,因此它们可以使用std::string相等来匹配。

看来您真的想“合并”两个节点;这已经在 yaml-cpp 问题列表中出现了一段时间:https ://code.google.com/p/yaml-cpp/issues/detail?id=41 ,并且有一些讨论解释了为什么这是一个难题.

作为一种可能的解决方法,如果您知道每个节点的类型,则可以在进行比较之前显式转换,例如:

doc1[it->first.as<T>()] = it->second;
于 2013-09-03T13:31:11.957 回答