我在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类,因此无法通过将注释添加到节点来发出注释,除非您自己重写发射器。