覆盖YAML子项

时间:2011-02-02 13:47:48

标签: yaml

说我有以下YAML文件:

-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: value
-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: SOME DIFFERENT VALUE

处理大量相同数据的自然方法是使用锚点,并覆盖更改的键。

问题是,这里的子键是不同的。是否有一种简单的方法可以引用key100['subkey100']已更改?或者我是否必须在每个级别使用一系列锚点?

即,是否有简写:

- &anchor
   key1: value
# and so on...
   key99: value
   key100: &subanchor
      subkey1: value
# and so on...
      subkey100: value
-
   <<: *anchor
   key100:
      <<: *subanchor
      subkey100: SOME DIFFERENT VALUE

2 个答案:

答案 0 :(得分:8)

如果我正确理解了这个问题,我认为该规范不支持覆盖锚定节点的元素。

在阅读spec(版本1.2,但1.1说的相同)时,7.1 Alias Nodes部分(强调我的):

  

先前序列化的节点的后续出现将显示为别名节点。节点的第一次出现必须用锚标记,以允许后续出现作为别名节点。

     

别名节点由“*”指示符表示。别名是指具有相同锚点的最近的前一节点。别名节点使用先前未在文档中出现的锚点是错误的。指定任何别名节点未使用的锚点都不是错误。

     

请注意,别名节点不得指定任何属性或内容,因为这些属性或内容已在第一次出现时指定。

这里有两点:

  1. “以前序列化的节点” - 此措辞表明别名旨在表示原始节点的另一个出现,而不仅仅是原始节点中的数据。换句话说,它代表相同的对象,而不是副本。

  2. 如果别名不能包含任何内容(第二个粗体部分),则无法以问题中建议的方式指定覆盖。

  3. 所以我对规范的解释是你不能按照规范这样做。

    但是 - 如果您将示例(第二个代码块)从原始文件粘贴到this online tool(您可能要取消选中'规范'),该工具会按照问题中的预期解释它,复制原始内容但覆盖subkey100。与此YAML Lint Tool相同,this online parser也一样。

    所以它似乎在实践中起作用,但我在规范中找不到对它的支持。

答案 1 :(得分:-1)

此功能已添加到yaml中,现在受支持https://confluence.atlassian.com/bitbucket/yaml-anchors-960154027.html