如何使用 Nokogiri 将两个 XML 文件合并为一个



我有两个XML文件,想要合并它们,但是已经存在的标签不应该改变:

XML 1:

<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat>8</mat>
  </identify>
</formX>

XML 2:

<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat>9999</mat>
    <name>John Smith</name>
  </identify>
</formX>

我希望结果是这样的:

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

以前的标签应具有相同的值,但添加了新标签。使用Nokogiri可以吗?如何?

起初,我尝试在没有Nokogiri的情况下使用:

xml1 = Hash.from_xml('<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat>8</mat>
  </identify>
</formX>')

但是当我转换回xml(xml1.to_xml)时,我的格式错误:

"<?xml version="1.0" encoding="UTF-8"?>n<hash>n  <formX>n    <xmlns>sdu:x</xmlns>n    <identify>n      <mat>8</mat>n    </identify>n  </formX>n</hash>n"

使用Nokogiri,我想出了这个解决方案,但实际上,它太丑了,并且有一个错误。如果 xml2 没有元素,它将崩溃:

require 'nokogiri'
s = "<formAposentadoria xmlns="spu:aposentadoria"><identificacao><matricula>8</matricula></identificacao></formAposentadoria>"
xml1 = Nokogiri::XML.parse s
s2 = "<formAposentadoria xmlns="spu:aposentadoria"><identificacao><matricula>9</matricula><nome>John</nome></identificacao></formAposentadoria>"
xml2 = Nokogiri::XML.parse s2
def node_list elem, &proc
  return [] unless elem.class == Nokogiri::XML::Element
  str = proc.call(elem)
  [str] + elem.children.inject([]){|a,c| a+node_list(c,&proc)}.map{|e| "#{str}/#{e}"}
end
node_list(xml1.root){|e| e.name}.each do |x|
  caminho = '//xmlns:' + x.gsub('/', '/xmlns:')
  puts caminho
  if xml2.at_xpath( caminho ).children.children.count == 0
    xml2.at_xpath( caminho ).content = xml1.at_xpath( caminho ).content
  end
end
puts xml2.to_xml

根据您的示例和所需的输出,您似乎只想将 XML2 中的mat值替换为 XML1 中的mat值。

require 'nokogiri'
xml1 = Nokogiri::XML('<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat>8</mat>
  </identify>
</formX>')
xml2 = Nokogiri::XML('<?xml version="1.0"?>
<formX xmlns="sdu:x">
  <identify>
    <mat>9999</mat>
    <name>John Smith</name>
  </identify>
</formX>')
xml2.at('mat').content = xml1.at('mat').content
puts xml2.to_xml

哪些输出:

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

这不是真正的合并,而是简单的替换。如果问题还有更多,则需要修改您的示例和所需的输出以使其更全面。

相关内容

  • 没有找到相关文章

最新更新