2011-06-21 51 views
1

我有兩個XML文件。第一個是:如何用另一個XML文件中的節點替換XML文件中的一個節點?

<a> 
    <b> 
    <c1>1</c1> 
    </b> 
    <b> 
    <c1>2</c1> 
    </b> 
    <b "id" = "true"> 
    <c1>3</c1> 
    <d "do" ="me"></d> 
    </b> 
    <b id ="true"> 
    <c1>4</c1> 
    </b> 
</a> 

而第二個是:

<a> 
    <b> 
    <c1>5</c1> 
    </b> 
</a> 

我想更新從first.xml元素:從second.xml元素

<b "id" = "true"> 
    <c1>3</c1> 
    <d "do" ="me"></d> 
</b> 

<b> 
<c1>5</c1> 
</b> 

我試圖通過de將first.xml中的所有<b>節點放在一起,並添加從second.xml文件獲取的節點<b>。我可以刪除所有節點<b>,但無法從second.xml獲取元素並將其添加到first.xml。

+0

爲什麼不拿出來使用的代碼嗎?你使用正則表達式還是解析器?如果是這樣,哪一個? –

+2

這不是格式良好的XML。屬性名稱不應被引用。而不是''應該是''。 –

+0

另外,您需要具體說明如何更新第一個文件。你想追加一個節點,添加數字還是什麼?如果您提供您期望的輸出示例,那將是最好的。 –

回答

3

清理源XML之後,這似乎是你在找什麼:

xml1 = <<EOT 
<a> 
    <b> 
    <c1>1</c1> 
    </b> 
    <b> 
    <c1>2</c1> 
    </b> 
    <b id="true"> 
    <c1>3</c1> 
    <d do="me"></d> 
    </b> 
    <b id="true"> 
    <c1>4</c1> 
    </b> 
</a> 
EOT 

xml2 = <<EOT 
<a> 
    <b> 
    <c1>5</c1> 
    </b> 
</a> 
EOT 

require 'nokogiri' 

doc1 = Nokogiri::XML(xml1) 
doc2 = Nokogiri::XML(xml2) 

doc1_b = doc1.at('//b[@id="true"]/c1/..') 
doc2_b = doc2.at('b') 

doc1_b.replace(doc2_b) 

puts doc1.to_html 

,輸出:

<a> 
  <b> 
    <c1>1</c1> 
  </b> 
  <b> 
    <c1>2</c1> 
  </b> 
  <b> 
    <c1>5</c1> 
  </b> 
  <b id="true"> 
    <c1>4</c1> 
  </b> 
</a> 

doc1.at('//b[@id="true"]/c1/..')'的意思是「找到一個b標籤的首次出現與id="true"與小孩c1節點「。

+0

這是一個很好的答案。然而XPath @bicepjai想要的更像'// b [@ id =「true」和d/@ do =「me」]',他需要遍歷所有匹配。 –

+0

我們不知道。他的問題不清楚,他說「一個要素」,而不是「所有要素」。 –

+0

我們知道這一點,因爲他對你的回答是,除了在錯誤的地方(讀他對他自己的問題的最後一條評論)。 :) –

0

選項 // B [@ ID = 「true」 和d/@ DO = 「我」]

上述答案回答我的問題

相關問題