创建 XML 文件的差异
项目描述
xmldiff
xmldiff 是一个库和命令行工具,用于生成 XML 的差异。这看起来可能不需要一个专门的工具,但在层次数据中的更改检测与在扁平数据中的更改检测非常不同。XML 类型格式不仅用于计算机可读数据,而且通常也用作可以渲染成人类可读格式的层次数据格式。对这种格式的传统差异会比较行和行地显示差异,但这对于人类来说是不易读的。 xmldiff 提供了在这些情况下制作人类可读差异的工具。
完整文档在 xmldiff.readthedocs.io
xmldiff 仍在快速发展中,不能保证一个版本的输出将与任何先前版本的输出相同。
快速使用
xmldiff 既是命令行工具也是 Python 库。要从命令行使用它,只需运行 xmldiff 并带有两个输入文件
$ xmldiff file1.xml file2.xml
还有一个命令用于使用 xmldiff 命令的输出修补文件
$ xmlpatch file.diff file1.xml
还有一个简单的 API 用于将 xmldiff 作为库使用
from lxml import etree from xmldiff import main, formatting diff = main.diff_files('file1.xml', 'file2.xml', formatter=formatting.XMLFormatter())
还有一个方法 diff_trees(),它接受两个 lxml 树,还有一个方法 diff_texts(),它将接受包含 XML 的字符串。同样,还有 patch_file()、patch_text() 和 patch_tree()
result = main.patch_file('file.diff', 'file1.xml')
xmldiff 0.6/1.x 的更改
从头开始的完整、纯 Python 重写
更容易维护,代码更简单、更符合 Python 风格,并且使用更多自定义类而不是仅仅嵌套列表和字典。
解决了某些大文件的问题,并解决了内存泄漏。
为将其作为库使用提供了一个非常好用、易于使用的 Python API。
添加了对以不同格式显示差异的支持,主要是在 XML 中标记差异,这对于制作人类可读的差异非常有用。
这些格式可以以语义上有意义的方式显示文本差异。
还提供了与 0.6/1.x 兼容的输出格式。
2.0 版本目前比 xmldiff 0.6/1.x 慢得多,但这种情况将在未来改变。目前我们不努力使 xmldiff 2.0 快速,我们专注于使其正确且可使用。
贡献者
Lennart Regebro,regebro@gmail.com(主要作者)
Stephan Richter,srichter@shoobx.com
Albertas Agejevas,alga@shoobx.com
Greg Kempe,greg@laws.africa
菲利普·德姆斯基,glamhoth@protonmail.com
杰克·查鲁普卡,krunchfrompoland@gmail.com
托马斯·菲茨inger,thpfitzinger@web.de
差异算法基于“分层结构信息中的变化检测”,文本差异使用Google的diff_match_patch算法。
变更
2.7.0 (2024-05-13)
更改了比较方式,使准确性和标准化更准确,但速度也因此降低。
将弃用的pkg_resources包的使用更改为importlib.metadata。
托马斯·菲茨inger在XMLFormatter中添加了use_replace标志。它将文本替换从删除和插入标签更改为替换标签。目前无法通过CLI访问,问题在于是否添加新的格式化器名称,或者添加传递格式化器标志的选项。
向XMLFormatter添加了使用替换标签的选项
在_diff_tags后,相邻的删除/插入差异被合并为一个替换标签
被删除的文本作为属性(“old-text”)添加
插入的文本是元素文本
2.6.3 (2023-05-21)
补丁中也有一个命名空间错误。#118
2.6.2 (2023-05-21)
解决了在默认命名空间中使用xmlformatter时的错误。#89
2.6.1 (2023-04-05)
#108:修复了使用ns0或ns1等命名空间时发生的错误。
2.6 (2023-04-03)
添加了InsertNamespace和DeleteNamespace操作,以更好地处理命名空间的变化。应该可以解决任何“未知命名空间前缀”错误。不支持更改命名空间前缀的URI,这将引发错误。
2.6b1(2023-01-12)
对于节点比率,使用几何平均值以更好地处理简单节点。
添加了一个实验性的–best-match方法,它较慢,但当你有很多相似节点时,生成的差异更小。
-F参数现在也影响–fast-match阶段。
2.5 (2023-01-11)
使调整比较节点时考虑的属性成为可能。
现在支持Python版本3.7到3.11。
改进了节点匹配方法,在权衡属性与子项时更注重相似性而非差异性。
添加了一个参数,当文件之间存在差异时返回错误代码1。
添加了一个参数用于在比较中忽略属性。
解决了在特定命名空间情况下xmlpatch中的错误。
向xmlpatch添加了–diff-encoding参数,以支持不在系统默认编码中的diff文件。
2.4 (2019-10-09)
添加了一个选项,可以传递(元素,属性)对作为树匹配的唯一属性。也在命令行上公开了这个选项。
2.3 (2019-02-27)
添加了一个简单的xmlpatch命令和API。
对文档和代码风格进行了多项更新。
2.2 (2018-10-12)
处理顶层注释和xml格式化器的解决方案
2.1 (2018-10-03)
将替换Unicode字符区域更改为使用BMP(0)中的私有用途区域,以支持窄Python构建。
添加了–unique-attributes参数。
2.1b1(2018-10-01)
添加了更快的节点比较选项。现在“中间”选项是默认的,它在匹配中很少改变,但速度要快得多。
实现了一个更快的匹配算法,以实现更快的差异比较。
通过缓存提高了速度。
修复了MoveNode操作有时顺序错误的错误。
添加了InsertComment操作,因为注释需要不同的处理,所以这种方式处理它们更方便。您仍然可以使用DeleteNode和UpdateTextIn来处理它们,无需特殊处理。
在重命名标签时,XMLFormatter将使用“diff:rename”标记它们,而不是创建新标签删除旧标签。
标签现在将首先移动,然后更新和重命名,因为新的标签名或属性可能在旧位置无效。
2.0 (2018-09-25)
完全自上而下的纯Python重写
新的简单API
100%测试覆盖率
新的输出格式
带有新操作的新的默认输出格式
一个旨在可由任何解析旧格式的程序解析的格式
标记和属性标记变化的XML
xmldiff 2.0比xmldiff 0.6或1.0慢得多,到目前为止的重点是正确性,而不是速度。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。