如何使用另一个XML文件中的节点替换XML文件中的一个节点?

时间:2011-06-21 00:26:12

标签: ruby xml rexml

我有两个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。

2 个答案:

答案 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”]

以上答案回答了我的问题