2016-08-18 78 views
2

我有這種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

回答

2

您擁有的按鍵對於此操作實際上效果並不理想,因此最好的辦法是將頂級按鍵的按鍵解析爲備用字典,其中按鍵指向相同(字典)值作爲原始映射/字典:

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

謝謝!這樣可行 –