将两个xml文档与ruby合并的最佳/最快方法是什么?
我有两个xml文件,一个是格式化的,因此它具有视觉吸引力,一个不是(并且它有注释和空白被剥离),它对整个节点有一些变化,并且它经常被改变。所以我试图找出一个简单而有效的解决方案来检查更改的内容(它们可能都没有ID),并将旧文档与格式化文档合并。
答案 0 :(得分:4)
答案 1 :(得分:4)
答案 2 :(得分:1)
更改仅在已剥离的文件中?换句话说,视觉上吸引人的文件是主文件,它只是根据传播剥离文件中的更改而改变,还是两个文件都是独立编辑的?如果不同时进行编辑,您是否可以将剥离的文件与其自身的最后一个实例进行区分,然后应用这些更改?
答案 3 :(得分:0)
我过去一直想要类似的功能(主要用于单元测试xml生成),但我从来没有找到一个好的解决方案。我想在某些时候你会想要比较两个DOM并寻找差异。
你可以看看this 'xml subset matcher' tool如何为灵感做点事。
答案 4 :(得分:0)
查看this question的答案可能会有所帮助
答案 5 :(得分:0)
您可能需要实现自己的差异逻辑。 Ruby的XML解析库都不支持文档差异。在尝试开发逻辑时,您可以查看LibXML :: XML :: Node的==运算符,它允许基于XML表示形式比较两个Node对象。
答案 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文件的不同版本,那么即使在昂贵的商业工具中,您也会看到这样做有多难。