ruby中的xml差异?

将两个xml文档与ruby合并的最佳/最快方法是什么?

我有两个xml文件,一个是格式化的,因此它具有视觉吸引力,一个不是(并且它有删除的注释和空格),它对整个节点进行了一些更改,并且经常更改。 因此,我试图找出一个简单而有效的解决方案来检查更改的内容(它们可能并非都有ID),并将旧文档与格式化文档合并。

几个月前,Ara Howard发布了一个片段,用于比较XML文档: 比较XML 。

这个等效的xml有一个gem

更改仅在剥离文件中吗? 换句话说,视觉上吸引人的文件是主文件,它只是根据传播剥离文件中的更改而改变,还是两个文件都是独立编辑的? 如果不是两个都被编辑,你可以只是将剥离的文件与自己的最后一个实例区分开来,然后应用这些更改吗?

我过去一直想要类似的function(主要用于unit testingxml生成),但我从来没有找到一个好的解决方案。 我想在某些时候你会想要比较两个DOM并寻找差异。

你可以看看这个’xml子集匹配器’工具如何为灵感做点什么。

检查这个问题的答案可能会有所帮助

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

LibXML API文档

格式化XML是一种选择吗?

require "rexml/document" formatter = REXML::Formatters::Pretty.new( 2 ) xml = REXML::Document.new 'Stilton2502009-12-25' formatter.write( xml, $stdout ) # Outputs: # #  # Stilton #  #  # 250 #  #  # 2009-12-25 #  # 

您还可以使用Chilkat Ruby XML组件,它是免费软件。

 require 'chilkat' xml = Chilkat::CkXml.new() xml.LoadXml("Stilton2502009-12-25") print xml.getXml() + "\n"; # Outputs: # #  #  # Stilton # 250 # 2009-12-25 #  

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

我建议的另一个选项是使用整洁打印两者,然后将两者文本差异并解析结果。

我担心这样做的唯一方法就是手工编写代码。 我已经编写了自己的XML diff算法,如果你保持身份证,那就容易多了。 通用XML diff实用程序将以不可预测的方式运行。

如果您曾经让您的SCM尝试自动激活相同XML文件的不同版本,那么即使在昂贵的商业工具中,您也会看到这样做有多难。