2009-10-05 2 views
4

Каков наилучший/самый быстрый способ слияния двух документов xml с рубином?xml diff в рубине?

У меня есть два xml-файла, один из которых отформатирован, поэтому он визуально привлекателен, тот, который не имеет (и у него есть комментарии и пробелы), который имеет несколько изменений для некоторых из узлов повсюду, и он часто изменяется , Поэтому я пытаюсь найти простое и эффективное решение для проверки того, что изменилось (возможно, у них не все есть ID), и объединить старый документ с отформатированным документом.

+4

Визуально привлекательным XML? Это новый ... ;-) –

+1

Помада на свиньи. –

+0

Возможный дубликат [diff a ruby ​​string or array] (http: // stackoverflow.com/questions/80091/diff-a-ruby-string-or-array) – sawa

ответ

4

Ара Говард опубликовал фрагмент кода несколько месяцев назад для сравнения XML документов: Comparing XML.

+0

Я не понимаю, почему это нужно, чтобы быть предпочтительным :), равнозначный-xml (см. ответ ниже), кажется, намного проще –

1

Имеются ли изменения только в разделенном файле? Другими словами, является ли визуально привлекательный файл основным файлом, который изменяется только на основе распространения изменений в разделенном файле или оба файла редактируются независимо? Если вы оба не редактируете, можете ли вы просто разделить разделенный файл на последний экземпляр самого себя, а затем применить эти изменения?

0

Мне нужна была аналогичная функциональность в прошлом (в основном для модульного тестирования xml поколения), но я никогда не находил подходящего решения. Я бы предположил, что в какой-то момент вам захочется сравнить два DOM и искать различия.

Возможно, вы можете взглянуть на то, как this 'xml subset matcher' tool делает вещи для вдохновения.

0

Вы, вероятно, будете необходимо реализовать собственную логику сравнивает. Ни одна из библиотек разбора XML для документа поддержки Ruby не отличается. При попытке разработать логику вы можете посмотреть на оператор == для LibXML :: XML :: Node, который позволяет сравнивать два объекта Node на основе их представления XML.

LibXML API Docs

0

Может ли форматирование XML быть вариантом?

require "rexml/document" 
formatter = REXML::Formatters::Pretty.new(2) 
xml = REXML::Document.new '<cheese><name>Stilton</name><weight>250</weight><expire_date>2009-12-25</expire_date></cheese>' 
formatter.write(xml, $stdout) 

# Outputs: 
#<cheese> 
# <name> 
# Stilton 
# </name> 
# <weight> 
# 250 
# </weight> 
# <expire_date> 
# 2009-12-25 
# </expire_date> 
#</cheese> 

Вы также можете использовать Chilkat Ruby XML компонент, это бесплатно.

require 'chilkat' 
xml = Chilkat::CkXml.new() 
xml.LoadXml("<cheese><name>Stilton</name><weight>250</weight><expire_date>2009-12-25</expire_date></cheese>") 
print xml.getXml() + "\n"; 

# Outputs: 
# 
# <?xml version="1.0" encoding="utf-8" ?> 
# <cheese> 
#  <name>Stilton</name> 
#  <weight>250</weight> 
#  <expire_date>2009-12-25</expire_date> 
# </cheese> 
0

Я боюсь, что единственный способ сделать это - передать его. Я написал свои собственные алгоритмы XML-diff, и это намного проще, если вы держите ID. Универсальные утилиты XML diff будут действовать непредсказуемо.

Если вы когда-либо позволяли своему SCM пытаться авторизовать различные версии одного и того же файла XML, вы увидите, насколько это сложно сделать, даже в дорогих коммерческих инструментах.

0

Если вы создаете xml через ruby, я бы предложил разделить xml на объекты ruby, сравнив их, а затем повторно вывести различия.

Другой вариант, который я хотел бы предложить, - это красиво напечатать оба, используя аккуратный, затем текст diff the two и проанализировать результат.