Как сравнить два XML-файла и отобразить различия в формате HTML, используя Ruby - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть ряд 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>

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Альтернативное решение, использующее 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>
0 голосов
/ 17 сентября 2018

Существует камень nokogiri-diff , который вы можете использовать для этого.Он просто находит различия и возвращает объект 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>
...