1

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

我试图通过<b>从 first.xml 中删除所有节点并添加<b>从 second.xml 文件中获取的节点来实现这一点。我能够删除所有节点<b>,但无法从 second.xml 中获取元素并将其添加到 first.xml。

4

2 回答 2

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

于 2011-06-21T00:41:45.883 回答
0

选项 //b[@id="true" 和 d/@do="me"]

以上答案回答了我的问题

于 2011-06-21T19:24:51.603 回答