将注释附加到YAML::节点,以便在输出中进行演示



我在C++11中使用yaml-cpp。我可以使用以下简单的东西创建一个YAML文件:

#include <yaml-cpp/yaml.h>
#include <iostream>
int main(void)
{
YAML::Node  topNode;
topNode["one"]["two"]["A"] = "foo";
topNode["one"]["two"]["B"] = 42;
std::cout << "%YAML 1.2n---n" << topNode;
return 0;
}

这将生成一个YAML文件,如下所示:

%YAML 1.2
---
one:
two:
A: foo
B: 42

太好了!

我还可以生成完全相同的YAML文件,如下所示:

#include <yaml-cpp/yaml.h>
#include <iostream>
int main(void)
{
YAML::Emitter  out;
out << YAML::BeginMap // document {
<< "one"
<< YAML::BeginMap // one {
<< "two"
<< YAML::BeginMap // two {
<< YAML::Key << "A" << YAML::Value << "foo"
<< YAML::Key << "B" << YAML::Value << 42
<< YAML::EndMap // two }
<< YAML::EndMap // one }
<< YAML::EndMap // document }
;
std::cout << "%YAML 1.2n---n"
<< out.c_str();
return 0;
}

第二种方法的好处是,我还可以在输出文件中添加注释:

#include <yaml-cpp/yaml.h>
#include <iostream>
int main(void)
{
YAML::Emitter  out;
out << YAML::BeginMap // document {
<< "one"
<< YAML::BeginMap // one {
<< "two"
<< YAML::BeginMap // two {
<< YAML::Key << "A" << YAML::Value << "foo"
<< YAML::Comment("A should be 'foo'")
<< YAML::Key << "B" << YAML::Value << 42
<< YAML::Comment("B is meaningful")
<< YAML::EndMap // two }
<< YAML::EndMap // one }
<< YAML::EndMap // document }
;
std::cout << "%YAML 1.2n---n"
<< out.c_str();
return 0;
}

生产:

%YAML 1.2
---
one:
two:
A: foo  # A should be 'foo'
B: 42  # B is meaningful

我的问题是,是否有办法在第一种方法中添加评论?也许是这样的:

topNode["one"]["two"]["A"] = "foo";
topNode["one"]["two"]["A"].addComment("A should be 'foo'");

我可以将YAML::Node子类化,添加我的addComment()方法,但我不想重写所有YAML::Emitter以适当地附加我的注释。代码在那里,但我不知道如何获取。如何获取?你能给我举个例子或方法吗?

据我所知,YAML规范规定注释不是YAML文件的组成部分,可以丢弃。我的用户发现它们很有用,所以我不喜欢以";你的问题很愚蠢":-(

这在当前API中是不可能的。Emitter使用EventHandler,正如您所看到的,它不能发出注释。

创建事件的Emit函数也不会通过其他方式创建任何注释事件。

由于Node上的operator<<将在内部使用Emitter类,因此无法通过将注释添加到节点来发出注释,除非您自己重写发射器。

最新更新