YAML附加文件

问题描述:

我有这种YAML文件中的数据:YAML附加文件

Main_part1: 
    label1: Main PArt1 


Main_part2: 
    label2: Main Part2 


A_part1: 
    label3: part1 of A 

A_part2: 
    label4: part 2 of A 

B_part1: 
    label5: this is part 1 of B 

B_part2: 
    label6: this is part 2 of B 

我有2个<div>标签为A和B.如果点击了一个,的A_part1内容应追加到HTML文件Main_part1A_part2应附加到Main_part2的内容。对于B也是类似的。然后发回一个响应给网页,添加A/B的内容。

最后,我想创建一个合并Main_Part1Main_Part2的最终YAML文件。

可以使用任何类型的解决方案(Java/Python等)。

我已经创建了不同的标签来显示所有块中的内部信息是不同的。举个例子:

假设您点击A,YAML文件看起来像:

Main_part1: 
    label1: Main PArt1 
    label3: part1 of A 
Main_part2: 
    label2: Main Part2 
    label4: part 2 of A 

A_part1: 
    label3: part1 of A 

A_part2: 
    label4: part 2 of A 

B_part1: 
    label5: this is part 1 of B 

B_part2: 
    label6: this is part 2 of B 

然后,在最后YAML文件合并Main_part1Main_part2

+0

'A_part1'的值是一个映射,而'Main_part1'的值是一个(字符串)标量(除了'A_part1'之外的*映射的键的所有其他值)。这是什么意思让你将一个映射追加到标量(或者在Python中 - 说是在'str'后面追加一个'dict'),你想把映射的字符串表示添加到标量吗?你希望结果与标量(Main_Part2的值)“合并”,这意味着什么? – Anthon

+0

所有是字符串。我相信这是冒号后的差距。另外,不要专注于内部的东西(标签部分)。当单击div A时,我需要一种将A(两个部分)内的东西附加到Main(两个部分)的方法。 –

+0

如果标量中的冒号后有空格,那么您需要将引号括起来(单或双)。你能举一个你期望的输出YAML的例子吗? – Anthon

您拥有的按键对于此操作实际上效果并不理想,因此最好的办法是将*按键的按键解析为备用字典,其中按键指向相同(字典)值作为原始映射/字典:

import sys 
import ruamel.yaml 

yaml_str = """\ 
Main_part1: 
    label1: Main PArt1 
Main_part2: 
    label2: Main Part2 
A_part1: 
    label3: part1 of A 
A_part2: 
    label4: part 2 of A 
B_part1: 
    label5: this is part 1 of B 
B_part2: 
    label6: this is part 2 of B 
""" 

data = ruamel.yaml.round_trip_load(yaml_str) 
alt = {} 
for key in data: 
    section, part = key.split('_') 
    alt[(section, part)] = data[key] 
alt[('Main', 'part1')].update(alt[('Main', 'part2')]) 

之后,你需要一个小帮手,把它和转储原:

def collapse(collapse_key): 
    for key in alt: 
     if key[0] == collapse_key: 
      alt[('Main', key[1])].update(alt[key]) 

collapse('A') # <- this should be a parameter to your script based on the click. 

ruamel.yaml.round_trip_dump(data, sys.stdout) 

给出:

Main_part1: 
    label1: Main PArt1 
    label3: part1 of A 
    label2: Main Part2 
    label4: part 2 of A 
Main_part2: 
    label2: Main Part2 
    label4: part 2 of A 
A_part1: 
    label3: part1 of A 
A_part2: 
    label4: part 2 of A 
B_part1: 
    label5: this is part 1 of B 
B_part2: 
    label6: this is part 2 of B 

如果你想用 的方式创建密钥,那么它当然会更容易一些(即,有两个元素):

(Main, part1): 
    label1: Main PArt1 
(Main, part2): 
    label2: Main Part2 
(A, part1): 
    label3: part1 of A 
(A, part2): 
    label4: part 2 of A 
(B, part1): 
    label5: this is part 1 of B 
(B, part2): 
    label6: this is part 2 of B 

以上是完美无缺的YAML,虽然没有被所有解析器接受。

+0

谢谢!这样可行 –