我需要解析 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"));
我认为您正在寻找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();