如何使用Ruby比较两个XML文件并以html格式显示差异

时间:2018-09-17 15:24:37

标签: ruby xml nokogiri

我的PC上存储了一系列xml文件。我使用宝石Nokogiri存储了这些文件的内容。我需要一次比较两个xml的内容。如果xml文件之间存在差异,我想在漂亮的html报告中显示这些差异,以供其他人查看。

有人知道该怎么做吗?

我正在比较的第一个xml文件:

input_gather("y", "n", None, agree_caesar_is_bad, disagree_caesar_is_bad, None, answer)

我正在比较的第二个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<SourceDetails>
    <Origin>Origin</Origin>
    <Identifier>Identifier</Identifier>
    <Timestamp>2001-12-31T12:00:00</Timestamp>
  </SourceDetails>
  <AsOfDate>2001-01-01</AsOfDate>
  <Instrument>
    <ASXExchangeSecurityIdentifier>ASX</ASXExchangeSecurityIdentifier>
  </Instrument>
  <Rate>0.0</Rate>

2 个答案:

答案 0 :(得分:2)

使用Diffy进行比较的替代解决方案。这是一个扁平字符串比较,但确实具有html格式的输出。

require 'diffy'

puts Diffy::Diff.new('./docOne.xml', './docTwo.xml', :source => 'files').to_s(:html)
#Example output
<div class="diff">
  <ul>
    <li class="unchanged"><span>&lt;root&gt;</span></li>
    <li class="del"><del>test</del></li>
    <li class="unchanged"><span>&lt;foo&gt;&lt;/foo&gt;</span></li>
    <li class="ins"><ins>&lt;bar&gt;&lt;/bar&gt;</ins></li>
    <li class="unchanged"><span>&lt;/root&gt;</span></li>
  </ul>
</div>

答案 1 :(得分:1)

有一个nokogiri-diff gem可用于执行此操作。它只是找到差异并返回一个Enumerable对象。

require 'nokogiri/diff'

xmlDoc1 = File.open("docOne.xml") { |f| Nokogiri::XML(f) }
xmlDoc2 = File.open("docTwo.xml") { |f| Nokogiri::XML(f) }

xmlDoc1.diff(xmlDoc2).each do |diff|
  puts diff
end
#2nd example
doc1 = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")
doc2 = Nokogiri::XML("<root><alienz><alien><name>Alf</name></alien></alienz></root><test></test>")

xmlDoc1.diff(xmlDoc2).each do |diff|
  puts diff
end
#2nd example output
<root>
  <aliens>
    <alien>
      <name>Alf</name>
    </alien>
  </aliens>
</root>
-
<aliens>
  <alien>
    <name>Alf</name>
  </alien>
</aliens>
+
<alienz>
  <alien>
    <name>Alf</name>
  </alien>
</alienz>