如何在 SnakeYAML-engine 中将 YAML 文件解析为节点

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

问题

我需要解析 Java 代码库中的 YAML 文件,但不仅如此:我需要知道我的应用程序的已解析键的行号。我想使用 1.2 规范解析 YAML 文件。现在我正在使用 SnakeYAML 引擎,但我对任何其他库持开放态度。

到目前为止我的研究

我正在尝试使用 SnakeYAML 引擎,因为它使用 1.2 规范而不是像 SnakeYAML 那样的 1.1 规范解析 yaml 文件。

对于 SnakeYAML 我发现这个对话其中包含一个有用的代码片段:

Node node = yaml.compose(new InputStreamReader(yamlStream));

这个 Node 类就是我所需要的。它包含在文件中找到每个关键字的行,但该代码段仅相对于 SnakeYAML 而不是 SnakeYAML 引擎

我需要等效的代码行(或行块)来实现相同的功能。 我可以在 SnakeYAML 引擎 中看到有一个等效的 Node (org.snakeyaml.engine.v2.nodes.Node) 类,我可以从类注释中读取它:

[...] the node graph is usually created by the org.snakeyaml.engine.v2.composer.Composer    

SnakeYAML 引擎 文档中,我没有看到任何对我有用的内容,也无法在线找到资源。有什么帮助吗?

申请详情

我使用的是 java 11,前面提到的类来自 SnakeYAML 引擎 2.0 版,尽管如果需要,我可以自由使用其他版本。

如果需要一些代码

内部build.gradle

//implementation 'org.yaml:snakeyaml:1.27', if you want to test it
implementation 'org.snakeyaml:snakeyaml-engine:2.0'

内部Main.javamain方法:

//code for SnakeYAML
Node node = new org.yaml.snakeyaml.Yaml().compose(new StringReader("key: value"));
java yaml snakeyaml
1个回答
0
投票

我认为您正在寻找Compose。它的构建和使用非常容易:

LoadSettings settings = LoadSettings.builder()
        .setUseMarks(true)
        // other settings as needed
        .build();
Compose compose = new Compose(settings);
Node node = compose.composeInputStream(yamlStream).orElseThrow();
// without the setUseMarks(true), these two will fail
Mark startMark = node.getStartMark().orElseThrow();
Mark endMark = node.getEndMark().orElseThrow();
© www.soinside.com 2019 - 2024. All rights reserved.