【问题标题】:Concise way of defining your own YAML syntax?定义自己的 YAML 语法的简洁方式?
【发布时间】:2019-12-30 12:04:16
【问题描述】:

对于 XML,有 Document Type Definitions (DTD) 定义所有元素,但是对于 YAML 是否有类似的东西?

我在Validating YAML with an XML DTD 上发现了一篇帖子,它建议无论如何都使用 DTD 和/或简单的 XML,但我怀疑这在我的情况下是否可行:我的项目决定采用(自定义)YAML 格式。从这种格式的 YAML 文件通过算法生成一个相当复杂的 XML。 YAML 包含的信息比 XML 少得多,但人类编辑器必须知道的所有重要信息。

目前,我的 YAML 的定义主要是平淡无奇的(作为非常抽象的需求文本),作为解析和转换为 XML 的实际源代码。两者都不适合应该维护 YAML 文件的最终用户。 是否有一种简洁明了的方式来定义我的自定义 YAML 语法?

【问题讨论】:

  • 我找到了yamllint hepful,但这不是我想要的。

标签: xml yaml dtd


【解决方案1】:

首先,YAML 是语法。你要描述的不是语法,而是结构。

YAML 是一种序列化格式。因此,您序列化和反序列化的数据类型是 YAML 文件的结构描述。除非您使用 YAML 进行数据交换,否则您通常会使用一个应用程序来加载 YAML 文件。

默认情况下,许多 YAML 实现反序列化为列表、字典和简单值(字符串、int 等)的异构结构。但是,如果您假设某种结构,您可以写下定义该结构的类型,然后将您的 YAML 加载到该类型的对象中。简单示例(本例中为 Java):

public class Book {
    public static class Person {
        public String name;
        public int age;
    }

    public Person author;
    public String title;
}

这种类型描述了这个 YAML 文档的结构:

author:
  name: John Doe
  age: 23
title: Very interesting title

任何能够反序列化为类型的 YAML 实现都能够检查这些类型;在运行时通过反射或在编译时通过宏或其他编译时评估方式。因此,您也可以检查该结构并使用它为用户自动生成文档(可能使用 JavaDoc cmets 来扩展文档)。

现在您可以使用动态类型语言。如果该语言是 Python,您仍然可以定义类来定义您的结构,并且可以使用 type hints 来定义标量值的类型。这为您提供了用户文档,但是您仍然需要手动实现验证,因为没有强制执行类型提示(PyYAML 的 add_path_resolver 是此处的重要钩子,用于将文档图的部分解析为特定类型,而无需使用 YAML 标记)。

对于其他语言,可能存在不同的解决方案。通常,最好维护一个描述 YAML 结构的单一事实来源 (SSOT),然后将其用作用户文档和验证的基础。而且由于 YAML 是一种序列化格式,如果语言和 YAML 实现允许您定义目标类型,那么目标类型是 SSOT 的自然选择。

【讨论】:

  • 非常感谢您的有用解释。首先,YAML 只能从/导入到 React-native(移动)应用程序中。然后它也应该在服务器上解析为 XML,例如通过 awk、perl 或 python。
  • 更具体地说,它是关于 BPMN,并且与 stackoverflow.com/a/59349583 相关(我的答案的第二部分)。 I.a.w.已经有我想要扩展的基本格式和结构。链接问题中解释了背后的痛点。
  • 请注意,YAML 在明文差异方面有其自身的问题。这里经常被问到的一个问题是映射中键的顺序,根据规范,它是任意的,不能传达内容信息。这导致许多实现无法设置顺序,因为映射是从不保留插入顺序的哈希映射序列化的(PyYAML 最近实现了保持顺序)。
  • 很好的提示!既然您对这些事情非常了解 - JSON 会成为 YAML 的替代品吗?
  • JSON Schema 绝对能够定义和验证结构。如果您不使用任何无法在 JSON 中表达的 YAML 结构(锚点、别名、标签、多个文档),您可以使用 JSON,甚至允许用户编写 YAML,因为有一个 tool that validates YAML against a JSON Schema
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多