如何使用Nokogiri将基于id的两个XML文件中的元素合并为一个?

时间:2015-02-22 12:38:41

标签: ruby xml nokogiri

我正试图建立一个先前提出的问题(How do I merge two XML files into one using Nokogiri?),但我遇到了一些困难。

我想仅在元素ID匹配时才将第一个XML文件中的“mat”内容导入第二个XML文件。这就是我到目前为止......

require 'nokogiri'

xml1 = Nokogiri::XML('<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat id="a">8</mat>
  </identify>
  <identify>
    <mat id="b">7</mat>
  </identify>  
</formX>')

xml2 = Nokogiri::XML('<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat id="a">9999</mat>
    <name>John Smith</name>
  </identify>
  <identify>
    <mat id="b">9999</mat>
    <name>Jane Smith</name>
  </identify>  
</formX>')

xml2.css('mat').each do |node|
  if xml2.at('mat')['id'] == xml1.at('mat')['id']
    node.content = xml1.at('mat').content
  end
end

puts xml2.to_xml

而且,我收到以下输出......

<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat id="a">8</mat>
    <name>John Smith</name>
  </identify>
  <identify>
    <mat id="b">8</mat>
    <name>Jane Smith</name>
  </identify>  
</formX>

但是,我正在拍摄......

<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat id="a">8</mat>
    <name>John Smith</name>
  </identify>
  <identify>
    <mat id="b">7</mat>
    <name>Jane Smith</name>
  </identify>  
</formX>

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

找到相同id元素的方式不对。 这有效:

xml2.css('mat').each do |node2|
  xml1.css('mat').each do |node1|
    if node1['id'] == node2['id']
      node2.content = node1.content
    end 
  end 
end
puts xml2.to_xml