如何使用复杂的密钥访问yaml

时间:2013-01-16 23:29:20

标签: yaml-cpp

文件test.yaml .....

   ---
   map:
        ? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl) 
        ? [L, bitsy] : ISO_LOW_BITSY(out, in, ctrl) 
        ? [L, spider] : ISO_LOW_SPIDER(out, in, ctrl) 
        ? [H, ANY] : ISO_HIGH(out, in, ctrl)

使用yaml-cpp可以使用什么命令来访问其中一个命令。我可以作为一个整体访问地图,但不能访问单个元素。

这是我正在尝试的:

    YAML::Node doc = YAML::LoadFile("test.yaml");
    std::cout << "A:" << doc["mapping"] << std::endl;
    std::cout << "LS1:" << doc["mapping"]["[L, spider]"] << std::endl;
    std::cout << "LS2:" << doc["mapping"]["L", "spider"] << std::endl;

以下是我的结果:

    A:? ? - L
          - itsy
 : ISO_LOW_ITSY(out, in, ctrl)
: ~
? ? - L
    - bitsy
  : ISO_LOW_BITSY(out, in, ctrl)
: ~
? ? - L
    - spider
  : ISO_LOW_SPIDER(out, in, ctrl)
: ~
? ? - H
    - ANY
  : ISO_HIGH(out, in, ctrl)
: ~
LS1:
LS2:

如果在yaml-cpp中尚不可能,我也想知道。

1 个答案:

答案 0 :(得分:1)

您必须定义与您的密钥匹配的类型。例如,如果您的密钥是两个标量的序列:

struct Key {
  std::string a, b;

  Key(std::string A="", std::string B=""): a(A), b(B) {}

  bool operator==(const Key& rhs) const {
    return a == rhs.a && b == rhs.b;
  }
};

namespace YAML {
  template<>
  struct convert<Key> {
    static Node encode(const Key& rhs) {
      Node node;
      node.push_back(rhs.a);
      node.push_back(rhs.b);
      return node;
    }

    static bool decode(const Node& node, Key& rhs) {
      if(!node.IsSequence() || node.size() != 2)
        return false;

      rhs.a = node[0].as<std::string>();
      rhs.b = node[1].as<std::string>();
      return true;
    }
  };
}

然后,如果您的YAML文件是

? [foo, bar]
: some value

你可以写:

YAML::Node doc = YAML::LoadFile("test.yaml");
std::cout << doc[Key("foo", "bar")];     // prints "some value"

注意:

我认为你的YAML不符合你的意图。在块上下文中,显式键/值对必须位于单独的行上。换句话说,你应该做

? [L, itsy]
: ISO_LOW_ITSY(out, in, ctrl)

? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl)

后者使它成为单个键,具有(隐式)空值;即,它与

相同
? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl)
: ~

(你可以通过yaml-cpp如何输出你的例子来看到这一点。)见the relevant area in the spec