我想使用 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文件。
您可以通过迭代事件流而不是构造本机值来完成此操作:
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,将其加载为另一个事件流,然后将该流的内容事件转储到主流中。
随着 2024 年 8 月发布的 SnakeYAML 2.3,终于可以在
DumperOptions
中禁用此行为。
dumperOptions.setDereferenceAliases(true);
请参阅 Javadoc 了解更多信息。