【问题标题】:library for doing diffs做差异的图书馆
【发布时间】:2025-11-21 12:10:01
【问题描述】:

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

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

【问题讨论】:

    标签: c++ diff


    【解决方案1】:

    Subversion 附带 libsvn_difflibsvn_delta 获得 Apache 软件许可许可。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】: