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 'Stilton 250 2009-12-25 ' formatter.write( xml, $stdout ) # Outputs: # # # Stilton # # # 250 # # # 2009-12-25 # #
您还可以使用Chilkat Ruby XML组件,它是免费软件。
require 'chilkat' xml = Chilkat::CkXml.new() xml.LoadXml("Stilton 250 2009-12-25 ") print xml.getXml() + "\n"; # Outputs: # # # # Stilton # 250 # 2009-12-25 #
如果您通过ruby创建xml,我建议将xml解析为ruby对象,比较这些,然后重新输出差异。
我建议的另一个选项是使用整洁打印两者,然后将两者文本差异并解析结果。
我担心这样做的唯一方法就是手工编写代码。 我已经编写了自己的XML diff算法,如果你保持身份证,那就容易多了。 通用XML diff实用程序将以不可预测的方式运行。
如果您曾经让您的SCM尝试自动激活相同XML文件的不同版本,那么即使在昂贵的商业工具中,您也会看到这样做有多难。