2009-10-05 45 views
4

什么是最好的/最快的方式来合并两个XML文档与红宝石?xml diff in ruby​​?

我有两个XML文件,一个是按照以下格式因此它是视觉上的吸引力,一个是没有(和它具有的意见和剥离空格),有一些在整个节点的一些变化,它就会经常改变。所以我试图找出一个简单而有效的解决方案来检查发生了什么变化(它们可能不都有ID),并将旧文档与格式化文档合并。

+4

视觉吸引力的XML?这是一个新的...... ;-) – 2009-10-05 08:18:10

+1

在猪上的口红。 – 2009-10-28 12:13:20

+0

[diff a ruby​​ string or array](http:// stackoverflow。com/questions/80091/diff-a-ruby-string-or-array) – sawa 2011-05-23 08:21:47

回答

4

阿糖胞苷霍华德贴片断几个月前比较XML文档: Comparing XML

+0

我不明白为什么这个人会成为首选:),equivalent-xml(见下面的答案)似乎更容易 – 2016-02-02 12:04:29

1

仅在剥离文件中进行更改吗?换句话说,视觉上吸引人的文件是一个主文件,仅在传播剥离文件中的变化时才进行更改,或者两个文件都是独立编辑的?如果不能同时进行编辑,你能否将剥离的文件与自身的最后一个实例进行比较,然后应用这些更改?

0

我以前想过类似的功能(主要是单元测试xml代),但我从来没有找到一个好的解决方案。我假设在某个时候你会想比较两个DOM并寻找差异。

你也许可以看看this 'xml subset matcher' tool如何做灵感。

0

你可能会需要实现自己的版本比较逻辑。 Ruby的XML解析库都不支持文档差异。在试图开发逻辑时,您可以查看LibXML :: XML :: Node的==运算符,该运算符允许比较基于XML表示的两个Node对象。

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差异算法,如果将ID保留在周围,它会更容易。通用的XML比较实用程序将以不可预知的方式发挥作用。

如果您曾经让您的SCM尝试自动合成同一个XML文件的不同版本,那么即使在昂贵的商业工具中,您也会发现这样做是多么的困难。

0

如果您通过ruby创建xml,我会建议将xml解析为ruby对象,比较这些对象,然后重新输出差异。

我建议的另一个选择是漂亮的打印都使用整齐,然后文本比较二和解析结果。