xml 差异? [已关闭]

问题描述 投票:0回答:9

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

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

xml ruby merge diff
9个回答
4
投票

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


4
投票

这个equivalent-xml

有一个宝石

1
投票

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


0
投票

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

您也许可以看看这个“xml子集匹配器”工具如何做事情以获得灵感。


0
投票

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


0
投票

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

LibXML API 文档


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
投票

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

我建议的另一个选择是使用 tidy 来漂亮地打印两者,然后对两者进行文本比较并解析结果。


-1
投票

恐怕唯一的方法就是手动编码。我已经编写了自己的 XML diff 算法,如果您保留 ID,事情就会容易得多。通用 XML diff 实用程序将以不可预测的方式运行。

如果您曾经让 SCM 尝试自动合并同一 XML 文件的不同版本,您就会发现即使在昂贵的商业工具中,正确执行此操作是多么困难。

© www.soinside.com 2019 - 2024. All rights reserved.