如何使用snakeyaml自动编辑包含锚点和别名的Yaml文件

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

我想使用 Snake YAML 自动化 YAML 文件处理

输入:

_Function: &_Template
  Name: A
  Address: B

_Service: &_Service
  Problem1:
   <<: *_Template
  Problem2:
   <<: *_Template

Function.Service:
 Service1:
  <<: *_Service
 Service2:
  <<: *_Service

修改后所需输出为

_Function: &_Template
  Name: A
  Address: B

_Service: &_Service
  Problem1:
   <<: *_Template
  Problem2:
   <<: *_Template

Function.Service:
 Service1:
  <<: *_Service
 Service2:
  <<: *_Service
 Service2:
  <<: *_Service

是否可以在不干扰锚点和别名的情况下修改文件,我尝试读取 Yaml 文件并将其写入不同的文件,输出文件包含形式键值对的 Map 对象。但是如何使用锚点和别名编写输出文件

Yaml yaml = new Yaml();
Map<String, Object> tempList = (Map<String, Object>)yaml.load(new FileInputStream(new File("/Users/Lakshmi/Downloads/test_input.yml")));
Yaml yamlwrite = new Yaml();
FileWriter writer = new FileWriter("/Users/Lakshmi/Downloads/test_output.yml");
yamlwrite.dump(tempList, writer);

如果不是snakeYaml,是否有任何语言我们可以在不干扰锚点和别名的情况下自动修改yaml文件。

yaml pyyaml snakeyaml
2个回答
1
投票

您可以通过迭代事件流而不是构造本机值来完成此操作:

final Yaml yaml = new Yaml();
final Iterator<Event> events = yaml.parse(new StreamReader(new UnicodeReader(
        new FileInputStream(new File("test.yml"))).iterator();

final DumperOptions yamlOptions = new DumperOptions();
final Emitter emitter = new Emitter(new PrintWriter(System.out), yamlOptions);
while (events.hasNext()) emitter.emit(events.next());

事件流是 YAML 文件结构的遍历,其中锚点和别名尚未解析,请参阅 YAML 规范中的此图:

您可以插入其他事件来添加内容。 这个答案展示了如何在 PyYAML 中做到这一点;由于SnakeYAML的API非常相似,因此用Java重写它应该没有问题。您还可以将所需的附加值编写为 YAML,将其加载为另一个事件流,然后将该流的内容事件转储到主流中。


0
投票

随着 2024 年 8 月发布的 SnakeYAML 2.3,终于可以在

DumperOptions
中禁用此行为。

dumperOptions.setDereferenceAliases​(true);

请参阅 Javadoc 了解更多信息。

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