У меня на компьютере хранится ряд XML-файлов. Я сохранил содержимое этих файлов с помощью гема Nokogiri. Мне нужно сравнить содержимое этих xmls по два за раз. Если есть различия между файлами xml, я хотел бы отобразить эти различия в красивом отчете html для просмотра другими.

Кто-нибудь знает, как это можно сделать?

Первый 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>

Второй файл xml, который я сравниваю:

<?xml version="1.0" encoding="UTF-8"?>
<SourceDetails>
        <Origin>FEED</Origin>
        <Identifier>IR</Identifier>
        <Timestamp>2017-01-01T02:11:01Z</Timestamp>
    </SourceDetails>
    <AsOfDate>2017-01-02</AsOfDate>
    <Instrument>
        <CommonCode>GB0</CommonCode>
    </Instrument>
    <Rate>0.69</Rate>
1
Kayla Nelson 17 Сен 2018 в 18:24

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>
2
Macro 25 Сен 2018 в 15:09

Для этого можно использовать 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>
1
Macro 17 Сен 2018 в 18:55