XML 对比规则
了解重复元素的按索引、LCS 与无序匹配,以及大小写选项、注释、CDATA、数字转换和命名空间前缀限制。
XML 对比规则决定解析后的元素名、属性、文本和重复子元素如何匹配。应根据文档含义选择规则,而不是根据哪种设置产生的差异最少。
数据对比检查什么
数据对比将每个文档解析为树状值,并比较:
- 元素,包括名称、嵌套子元素和文本内容;
- 属性,与元素文本和子元素分别比较;
- 文本,包括通过 CDATA 段提供的文本。
属性顺序和元素之间的缩进不会产生结构差异。默认情况下,元素名和值区分大小写。需要检查原始源格式时,请使用结果页的 Git Diff。
例如,以下文档在数据对比中结构相等:
<service name="billing" enabled="true">Ready</service>
<service
enabled="true"
name="billing"
>Ready</service>
属性值变化、文本变化、子元素缺失或元素重命名仍然是语义差异。
匹配重复元素
解析时,重复子元素会形成有序集合。设置中的数组对比选项控制它们的对齐方式;这里比较的是 XML 元素,并非 JSON 数组。
考虑以下基准输入:
<regions>
<region>us-east</region>
<region>eu-west</region>
<region>ap-south</region>
</regions>
以及以下对照输入:
<regions>
<region>us-east</region>
<region>ap-south</region>
<region>eu-west</region>
</regions>
按索引
按索引是默认方式,将每个重复元素与另一侧相同位置的元素比较。在示例中,eu-west 与 ap-south 交换位置,因此第 1、2 个位置都发生变化。
位置具有稳定含义时适合使用按索引,例如固定配置槽位或有序快照。在开头附近插入元素会使后续位置移动,从而可能将许多元素报告为变化。
LCS
LCS 使用最长公共子序列,在保持顺序的同时对齐相等元素。对于基本有序但增加或丢失条目的序列,它能让插入和删除与未变化的同级元素合理对齐。
LCS 仍然区分顺序。移动会通过删除和插入表示,而不是专门的移动操作;值重复时,一次插入也可能存在多种有效对齐方式。
无序
无序忽略同级元素顺序,按多重集匹配值。示例中的三个区域具有相同值和出现次数,因此无序方式将它们视为相等。
重复次数仍然重要。以下文档在无序方式下不相等,因为基准包含两个 admin,对照只有一个:
<!-- 基准 -->
<roles><role>admin</role><role>admin</role><role>editor</role></roles>
<!-- 对照 -->
<roles><role>editor</role><role>admin</role></roles>
只有顺序无关紧要时,才将无序用于标签或权限等集合。它不是集合对比,也不会丢弃重复项。
名称和值大小写选项
XML 提供两个大小写开关,没有单独的数字字符串选项。
忽略元素/属性名大小写
此选项应用于元素名和属性名。启用后,以下名称可以匹配:
<Service Status="ACTIVE" />
<service status="ACTIVE" />
如果 XML 词汇表中大小写不同的名称代表不同含义,请保持关闭。启用后,元素名和属性名的大小写差异都可能被有意忽略。
忽略值大小写
此选项应用于文本和属性值。启用后,ACTIVE 与 active 被视为相等:
<service status="ACTIVE">Ready</service>
<service status="active">ready</service>
对于区分大小写的标识符、令牌或用户内容,不要启用此选项。它改变值的比较方式,不影响元素名或属性名匹配。
解析器规范化与限制
忽略注释
修改或删除 XML 注释不会产生数据对比差异。Git Diff 使用原始输入文本,因此仍能看到注释变化。
CDATA 作为文本
CDATA 段提供文本值,不会形成单独的节点类别。以下值被视为相等:
<description>Primary billing</description>
<description><![CDATA[Primary billing]]></description>
修改 CDATA 中的字符会改变文本值。数据对比可能以规范化文本展示,而不保留原始 CDATA 写法。
形似数字的值转换为数字
解析器会将形似数字的元素文本和属性值转换为数字。因此,1 与 1.0 或 2.5 与 2.50 即使源文本写法不同,也可能被视为相等:
<limit retries="3">1.0</limit>
<limit retries="3.0">1</limit>
此转换自动进行。XML 没有 Numeric String Equals Number 开关。需要检查数据对比视为相等的数字写法变化时,请使用 Git Diff。
命名空间前缀不会解析为规范 URI
解析器在元素名和属性名中保留命名空间前缀,对比前不会将名称展开为规范命名空间 URI。因此,即使文档为同一命名空间使用不同前缀,也可能报告名称差异。应将前缀变化视为潜在的重要变化,并与命名空间声明属性一起审查。
例如,即使 soap:Envelope 与 env:Envelope 的声明指向同一 URI,也不会仅因此规范化成同一个展开名称。
数据对比、规范化输出与 Git Diff
数据对比使用解析值和全部所选规则。其编辑器展示根据这些值重新构建的 XML,因此源注释、原始缩进、CDATA 写法和数字写法不保证保留在结果中。
Git Diff 则逐行比较原始基准与对照文本。即使数据对比显示相同,它也能显示格式、注释、属性布局或值写法的变化。反过来,语义选项可以隐藏结构差异,却不会改变原始文本差异。
结果页的语义设置位于数据对比视图。修改规则会重新计算数据对比;Git Diff 始终是原始输入文本的只读视图。
故障排查
同级元素重排产生差异。 按索引和 LCS 都保留顺序。只有顺序没有意义时才选择无序,并检查重复值的出现次数。
一次插入使许多值移位。 按索引按位置对齐。对于包含插入或删除的有序序列,可尝试 LCS。
不同命名空间前缀产生意外差异。 对比不会根据命名空间 URI 规范化前缀。只有工作流已确认前缀可互换时,才在对比前统一前缀。
注释或数字写法变化只出现在 Git Diff。 这是预期行为:数据对比忽略注释并转换形似数字的值,Git Diff 则比较原始文本。
大小写差异消失。 检查是否启用了忽略名称大小写或值大小写。返回数据对比即可查看当前设置。
从 XML 快速开始获取完整的基准到对照示例,以及结果导航、URL 加载、分享和隐私说明。