跳转到主要内容

创建 XML 文件的差异

项目描述

xmldiff

https://travis-ci.org/Shoobx/xmldiff.svg?branch=master https://coveralls.io/repos/github/Shoobx/xmldiff/badge.svg

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 快速,我们专注于使其正确且可使用。

贡献者

差异算法基于“分层结构信息中的变化检测”,文本差异使用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)

  • 添加了InsertNamespaceDeleteNamespace操作,以更好地处理命名空间的变化。应该可以解决任何“未知命名空间前缀”错误。不支持更改命名空间前缀的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慢得多,到目前为止的重点是正确性,而不是速度。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

xmldiff-2.7.0.tar.gz (87.6 kB 查看哈希值)

上传时间

构建分发

xmldiff-2.7.0-py3-none-any.whl (44.0 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面