包括snakeyaml中的YAML文件

包括snakeyaml中的YAML文件,yaml,snakeyaml,Yaml,Snakeyaml,我希望YAML文件包含一个include,类似于这个问题,但包含Snakeyaml: 例如: %YAML 1.2 --- !include "load.yml" !include "load2.yml" 我有很多麻烦。我已经定义了构造函数,我可以让它导入一个文档,但不能导入两个。我得到的错误是: Exception in thread "main" expected '<document start>', but found Tag in 'reader', line 5,

我希望YAML文件包含一个include,类似于这个问题,但包含Snakeyaml:

例如:

%YAML 1.2
---
!include "load.yml"

!include "load2.yml"
我有很多麻烦。我已经定义了构造函数,我可以让它导入一个文档,但不能导入两个。我得到的错误是:

Exception in thread "main" expected '<document start>', but found Tag
 in 'reader', line 5, column 1:
    !include "load2.yml"
    ^
问题是,有没有人对Snakeyaml做过类似的事情?关于我可能做错了什么有什么想法吗?

我看到两个问题:

final InputStream input = new FileInputStream(new File("src/imports/" + value));
            final Yaml yaml = new Yaml(constructor);
            return yaml.loadAll(input);
您应该使用
yaml.load(输入)
,而不是
yaml.loadAll(输入)
。该方法返回多个对象,但
construct()
方法希望返回单个对象

另一个问题是,您可能对工作方式有一些不一致的期望:

如果您认为您的
!include
的工作原理与C语言中的一样,在C语言中,预处理器插入包含文件的内容,实现它的方法是在表示阶段(解析)或序列化阶段(编写)处理它。但是您已经在表示阶段(构造)实现了它,所以
!include
返回一个对象,YAML文件的结构必须与此一致

假设您有以下文件:

test1a.yaml

activity: "herding cats"
test1b.yaml

33
test1.yaml

favorites: !include test1a.yaml
age:       !include test1b.yaml
这可以正常工作,相当于

favorites:
  activity: "herding cats"
age: 33
但以下文件不起作用:

!include test1a.yaml
!include test1b.yaml
因为没有什么可以说明如何在更大的层次结构中组合这两个值。如果需要阵列,则需要执行以下操作:

- !include test1a.yaml
- !include test1b.yaml
或者,再一次,在早期阶段(如解析或组合)处理此自定义逻辑


或者,您需要告诉YAML库您正在启动第二个文档(这是错误所抱怨的:
预期为“”
),因为YAML支持单个.YAML文件中的多个“文档”(顶级值)

另外,感谢您发布此问题;它让我在支持
方面领先一步!包括
标记。
- !include test1a.yaml
- !include test1b.yaml