红宝石中的xml差异?

时间:2009-10-05 02:17:34

标签: xml ruby merge diff

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

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

9 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

这个equivalent-xml

有一个宝石

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

你可以看看this 'xml subset matcher' tool如何为灵感做点事。

答案 4 :(得分:0)

查看this question的答案可能会有所帮助

答案 5 :(得分:0)

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

LibXML API Docs

答案 6 :(得分: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>

答案 7 :(得分:0)

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

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

答案 8 :(得分:-1)

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

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