定义自己的 YAML 语法的简洁方法?



对于XML,有定义所有元素的文档类型定义(DTD(,但是YAML有类似的东西吗?

我找到了一篇关于使用 XML DTD 验证 YAML的文章,该帖子建议无论如何使用 DTD 和/或简单的 XML,但我怀疑这在我的情况下是否可行:我的项目决定采用(自定义(YAML 格式。从这种格式的 YAML 文件中,通过算法生成一个相当复杂的 XML。YAML 包含的信息比 XML 少得多,但人类编辑者必须知道的所有重要内容。

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

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

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

默认情况下,许多 YAML 实现反序列化为列表、字典和简单值(字符串、整数等(的异构结构。但是,如果假定某个结构,则可以记下定义该结构的类型,然后将 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 注释进行扩展文档(。

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

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

最新更新