2011-02-02 45 views
12

說我有以下YAML文件:覆蓋YAML子項

- 
    key1: value 
# and so on... 
    key99: value 
    key100: 
     subkey1: value 
# and so on... 
     subkey100: value 
- 
    key1: value 
# and so on... 
    key99: value 
    key100: 
     subkey1: value 
# and so on... 
     subkey100: SOME DIFFERENT VALUE 

自然的方式來處理大量的相同數據將與錨,並覆蓋只是改變的關鍵。

問題是,在這裏,一個子鍵是不同的。有沒有簡單的方法來引用key100['subkey100']已更改?或者我必須在每個級別使用一系列錨點?

即,是有一個簡寫:

- &anchor 
    key1: value 
# and so on... 
    key99: value 
    key100: &subanchor 
     subkey1: value 
# and so on... 
     subkey100: value 
- 
    <<: *anchor 
    key100: 
     <<: *subanchor 
     subkey100: SOME DIFFERENT VALUE 
+0

這應該是一個簡單的問題! Cmon人! – Thomas 2012-05-07 00:56:28

回答

7

如果我理解正確的問題,我不認爲該規範支持錨節點的首要元素。

在閱讀spec(1.2版本,但是1.1說是相同的),部分7.1 Alias Nodes狀態(重點煤礦):

一個以前序列節點的後續事件被呈現爲別名節點。節點的第一次出現必須用錨點標記,以允許隨後出現的節點作爲別名節點呈現。

別名節點由「*」指示符表示。別名是指具有相同錨點的最近的在前節點。對於別名節點來說,使用以前不在文檔中發生的錨點是錯誤的。指定未被任何別名節點使用的錨點並不是錯誤。

請注意,別名節點不能指定任何屬性或內容,因爲這些屬性或內容已在第一次出現節點時指定。

兩點的位置:

  1. 「以前序列節點」 - 這一措辭表明,別名是代表原始節點的另一個發生,不只是在原始節點的數據。換句話說,它表示同一個對象,而不是副本。

  2. 如果別名不能有任何內容(第二個粗體部分),那麼您不能以問題中建議的方式指定重寫。

所以我對規範的解釋是你不能根據規範來做到這一點。

但是 - 如果您將示例(第二個代碼塊)從原始代碼粘貼到this online tool(您可能想取消選中'規範'),該工具將其解釋爲問題中的預期內容,即複製原始內容但覆蓋子密鑰100。同YAML Lint Tool一樣,this online parser也是如此。

因此,它似乎在實踐中工作,但我無法在規範中找到它的支持。