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

如何自动编辑包含锚点的Yaml文件&;使用snakeyaml的别名,yaml,pyyaml,snakeyaml,Yaml,Pyyaml,Snakeyaml,我想使用snake YAML自动化YAML文件处理 输入: _Function: &_Template Name: A Address: B _Service: &_Service Problem1: <<: *_Template Problem2: <<: *_Template Function.Service: Service1: <<: *_Service Service2: <<:

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

输入:

_Function: &_Template
  Name: A
  Address: B

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

Function.Service:
 Service1:
  <<: *_Service
 Service2:
  <<: *_Service
\u函数:&\u模板
姓名:A
地址:B
_服务:&&u服务
问题1:

您可以通过迭代事件流而不是构造本机值来实现这一点:

final Yaml Yaml=new Yaml();
最终迭代器事件=yaml.parse(新的StreamReader(新的UnicodeReader(
新文件输入流(新文件(“test.yml”)).iterator();
最终转储选项yamlOptions=新转储选项();
最终发射器=新发射器(新PrintWriter(System.out),yamlOptions);
while(events.hasNext())emitter.emit(events.next());
事件流是YAML文件结构的遍历,其中锚点和别名尚未解析,请参见YAML规范中的此图:

您可以插入其他事件来添加内容。演示了如何在PyYAML中执行此操作;由于SnakeYAML的API非常类似,因此在Java中重写此操作应该没有问题。您还可以将所需的附加值写入YAML,将其加载为另一个事件流,然后将该流的内容事件转储到主流中

_Function: &_Template
  Name: A
  Address: B

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

Function.Service:
 Service1:
  <<: *_Service
 Service2:
  <<: *_Service
 Service2:
  <<: *_Service
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);