Ruby中的xml diff?[已关闭]

wmvff8tz  于 2023-10-17  发布在  Ruby
关注(0)|答案(9)|浏览(95)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

9年前关闭。
Improve this question
用ruby合并两个xml文档的最好/最快的方法是什么?
我有两个xml文件,一个是格式化的,所以它在视觉上是吸引人的,一个不是(它有注解和空白剥离),有一些变化的一些节点在整个,它得到经常改变。因此,我试图找出一个简单而有效的解决方案来检查更改的内容(它们可能不都有ID),并将旧文档与格式化文档合并。

i7uaboj4

i7uaboj42#

Ara霍华德几个月前发布了一个比较XML文档的片段:Comparing XML

dgtucam1

dgtucam13#

是否仅在剥离的文件中进行更改?换句话说,视觉上吸引人的文件是一个主文件,它只会根据剥离文件中的更改进行更改,还是两个文件都独立编辑?如果不是都被编辑,你能不能只对剥离文件本身的最后一个示例进行比较,然后应用这些更改?

zd287kbt

zd287kbt4#

我自己过去也想要类似的功能(主要是单元测试xml生成),但我从来没有找到一个好的解决方案。我假设在某个时候您会想要比较两个DOM并寻找差异。
你也许可以看看this 'xml subset matcher' tool是如何做事情的灵感。

polkgigr

polkgigr5#

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

mjqavswn

mjqavswn6#

你可能需要实现你自己的不同逻辑。Ruby的XML解析库都不支持文档区分。在尝试开发逻辑时,您可以查看LibXML::XML::Node的==操作符,它允许基于XML表示比较两个Node对象。
LibXML API Docs

wlp8pajw

wlp8pajw7#

格式化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>
6ojccjat

6ojccjat8#

如果你是通过ruby创建xml,我建议你将xml解析成ruby对象,比较它们,然后重新输出差异。
我建议的另一个选择是使用tidy将两者都打印出来,然后对两者进行文本diff并解析结果。

jecbmhm3

jecbmhm39#

恐怕唯一的办法就是手动编码。我已经编写了自己的XML diff算法,如果您保留ID,则会容易得多。通用的XML diff实用程序将以不可预测的方式运行。
如果您曾经让您的SCM尝试自动化同一个XML文件的不同版本,那么您会发现这是多么困难,即使是在昂贵的商业工具中。

相关问题