使用XMLUnit 2.8.2对比XML文件如何通过ComparisonFormatter获取详细差异
XMLUnit 2.8.2 自定义差异输出解决方案
核心说明
- 你遇到的差异信息不清晰问题,是默认的
Difference集合toString()输出逻辑过于简略导致的,ComparisonFormatter是官方提供的标准差异格式化方案,不需要额外依赖,2.8.2版本原生支持 - 你现有代码的节点匹配逻辑是正确的,无需调整,仅需要修改差异输出部分的代码即可
- 你现有代码中重复调用了两次
checkForSimilar(),属于冗余逻辑,可以删除其中一次,不影响对比效果
完整修改后代码
import org.xmlunit.diff.ComparisonFormatter; import org.xmlunit.diff.DefaultNodeMatcher; import org.xmlunit.diff.Diff; import org.xmlunit.diff.Difference; import org.xmlunit.diff.SimpleComparisonFormatter; import org.xmlunit.builder.DiffBuilder; import org.xmlunit.util.ElementSelectors; public class XmlCompareDemo { public static void main(String[] args) { String controlXml = "<Return><INFO><Area>0</Area><INFOId>AA23414</INFOId></INFO><INFO><Area>0</Area><INFOId>FQ001</INFOId></INFO></Return>"; String testXml = "<Return><INFO><Area>0</Area><INFOId>FA001</INFOId></INFO><INFO><Area>0</Area><INFOId>AA23414</INFOId></INFO></Return>"; DiffBuilder builder = DiffBuilder.compare(controlXml).withTest(testXml) .checkForSimilar() .ignoreWhitespace() .normalizeWhitespace() .ignoreComments() .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder() .whenElementIsNamed("INFO") .thenUse(ElementSelectors.byXPath("./INFOId", ElementSelectors.byNameAndText)) .elseUse(ElementSelectors.byName) .build())); // 初始化官方提供的简易格式化器 ComparisonFormatter formatter = new SimpleComparisonFormatter(); int diffCount = 0; Diff diff = builder.build(); if (diff.hasDifferences()) { // 遍历所有差异,用格式化器输出结构化详情 for (Difference difference : diff.getDifferences()) { System.out.println("差异详情:" + formatter.format(difference.getComparison())); diffCount++; } } System.out.println("差异总数 = " + diffCount); } }
输出效果说明
上述代码运行后,会输出清晰的结构化差异内容,示例如下:
差异详情:Expected text value 'FQ001' but was 'FA001' - comparing <INFOId ...> at /Return/INFO[2]/INFOId/text() to <INFOId ...> at /Return/INFO[1]/INFOId/text()
可以直接看到字段的预期值、实际值,以及对应的XPath路径,无需解析原始简略报错。
可选优化方案
如果默认的SimpleComparisonFormatter不能满足格式要求,可以自定义实现ComparisonFormatter接口,重写format方法,自定义要输出的字段(比如仅输出XPath和值差异、输出完整节点内容等),不需要修改其他对比逻辑。
内容的提问来源于stack exchange,提问作者zara
相关产品推荐
相关产品推荐

