将注释附加到 YAML::Node 以在输出中呈现

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

我正在将 yaml-cpp 与 C++11 一起使用。我可以使用这样简单的东西创建一个 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.2\n---\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.2\n---\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.2\n---\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 文件的组成部分,可以丢弃。我的用户发现它们很有用,所以我不喜欢以“你的问题很愚蠢”开头的辩论。 :-)

c++11 yaml yaml-cpp
2个回答
1
投票

当前的 API 无法做到这一点。发射器使用 EventHandler,如您所见,它无法发出注释。

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

由于

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


0
投票

如果你想考虑另一个库,由于缺乏其他广泛使用的库的支持,mrpt-containers 确实实现了这样一个处理注释的功能。

请参阅如何添加注释的 C++ 示例此处

    // You can use {} to initialize mappings (dictionaries):
    using mrpt::containers::CommentPosition;
    using mrpt::containers::vcp;  // value-comment-position
    using mrpt::containers::vkcp; // value-key-comment-position

    mrpt::containers::yaml p;

    // Insert a key in a map with a "comment" block.
    p << vkcp("L", 5.5, "Arm length [meters]")
      << vkcp("D", 1.0, "Distance [meters]") << vkcp("Y", -5, "Comment for Y");

或者如何解析评论这里

    // Get comments:
    std::cout << "Comment: '" << p["myMap"]["nestedMap"]["a"].comment()
              << "'\n";

该库可以安装在基于 Debian 的系统中:

sudo apt install libmrpt-containers-dev

(免责声明:我是项目上游维护者)

© www.soinside.com 2019 - 2024. All rights reserved.