我可以将单个项目锚定在YAML集合中吗?

时间:2016-09-01 23:56:59

标签: yaml

如何编写Books集合以便我可以锚定单个项目?该文件无效。

Books:
  - Title: The Cat in the Hat &catInTheHat
    Author: Dr. Seuss
  - Title: Harry Potter
    Author: JK Rowling
People:
  - Name: Bill
    FavoriteBook: *catInTheHat
  - Name: Edna

1 个答案:

答案 0 :(得分:6)

是的,你可以,但在你的例子中你没有锚,并且因为你有一个没有相应锚的别名,你会收到一个错误(你应该因为这是不允许的)。
你所拥有的是一个标量字符串The Cat in the Hat &catInTheHat,它在中间某处有一个&符号 如果要定义锚点,则需要将放在实际项目之前(标量,序列,映射)。

如果您只想为The Cat in the Hat添加标量字符串FavoriteBook(这是标题的值),您可以这样做:

Title: &catInTheHat The Cat in the Hat 
Author: Dr. Seuss

有了这个,如果在解析之后从序列的第一个元素访问FavoriteBook的值,该元素是toplevel键People的值(在Python中:data['People'][0]['FavoriteBook'])你得到字符串"帽子里的猫"。

如果您希望序列的第一个元素是Books的值,则必须执行此操作:

Books:
  - &catInTheHat 
    Title: The Cat in the Hat 
    Author: Dr. Seuss
  - Title: Harry Potter
    Author: JK Rowling

然后你实际上得到了映射(dict / hash / map取决于你的编程语言)的表示,然后你可以从中直接检索标题和作者。 根据您使用的编程语言和YAML解析器,解析器可能会解析"别名,如果它引用标量(字符串,整数等)或不。转储从YAML源表示的数据会导致丢失锚点和别名。对于集合(序列,映射),通常情况并非如此(即它们在内存中引用相同的集合对象,并在序列化时写为锚点+别名)。