我有两个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中的元素:
<b "id" = "true">
<c1>3</c1>
<d "do" ="me"></d>
</b>
使用second.xml中的元素:
<b>
<c1>5</c1>
</b>
我尝试通过删除first.xml中的所有<b>
节点并添加从second.xml文件中获取的节点<b>
来实现此目的。我能够删除所有节点<b>
,但无法从second.xml获取元素并将其添加到first.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"
标记的第一个匹配项。”
答案 1 :(得分:0)
选项 // b [@ id =“true”和d / @ do =“me”]
以上答案回答了我的问题