2009-03-04 131 views
2

我一直负责创建一个工具,可以比较和合并我公司产品的配置文件。配置存储为XML或URL编码的字符串。我正在寻找一个图书馆,最好是开放源代码,与商业软件兼容的许可证,可以做这些差异。我们的应用程序是用C++编写的,因此C++库会是最好的,但是我愿意查看C#特定的库,因为我可以编写一个通过COM将它公开给C++的包装器。三向差异是理想的,但双向是可以接受的。如果它理解了XML,那也是一个优点(因为XML节点可以在不更改文档的情况下重新排序)。任何图书馆建议?我是否应该考虑编写自己的差异工具,希望能够为我们的格式提供语义知识?图书馆做差异

感谢this similar question,我已经发现this google library,这看起来非常棒,但我仍在寻找其他选择。它似乎也能够输出HTML格式的差异(使用<ins><del>标签,在我发现它之前我不知道这些标签),这可能非常方便,但它似乎只是一个统一的差异。我将需要在Web浏览器中显示结果,并且可能必须构建用于在浏览器中进行合并的接口。我不希望一个图书馆能够帮助完成这些任务,但是它必须以适合我的格式生成输出结果。我目前正在设想一些沿着TortoiseMerge(并排比较,不统一)的方式,除了基于浏览器的东西。任何提示/技巧/设计想法如何呈现这将不胜感激。

回答

1

为了区分XML,我建议您先对其进行标准化:按字母顺序对所有元素进行排序,然后生成代表原始文档但独立于原始格式的标记/ xml流。运行diff之后,解析结果以获取包含添加/删除内容的树。

3

Subversion附带libsvn_difflibsvn_delta许可下的Apache软件许可证。

2

Here是一个C++库,它可以区分作者称为半结构化数据的内容。它很好地处理HTML和XML。由于您的数据是XML,因此使用它代替纯文本差异会很有意义。当机器生成文件时尤其如此。

我目前正在尝试使用这个库来构建一个差异化Visual Studio项目文件的工具。这些基本上都是XML文件,使用像Winmerge这样简单的差异工具太痛苦了,因为Visual Studio几乎通过疯狂的重新排序来分散整个文件。这个想法是做一些结构化的差异来解决这个问题。