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

问题描述 投票:1回答:1

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

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

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

xml yaml dtd
1个回答
1
投票

首先,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,则仍可以定义类来定义结构,并且可以使用type hints定义标量值的类型。这为您提供了用户文档,但是由于不强制使用类型提示,因此您仍然需要手动执行验证(PyYAML的add_path_resolver是此处的重要钩子,用于将文档图形的某些部分解析为特定类型,而不必使用YAML标记)。

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

© www.soinside.com 2019 - 2024. All rights reserved.