我使用XMLUnit来比较两个XML来检测更新。我的目标是:
<dependency>
<groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId>
<version>1.6</version>
</dependency>对于大多数情况下,XMLUnit工作正常,除了很少有给定的差异是错误的或意外的。首先,让我们来看看XMLUnit正确工作的积极场景:
案例-1:
XML-原始:
<ClassHours>
<Hours close="11:10" day="27" classname="sec-1" open="17:20" noOfStudent="23"/>
<Hours close="11:10" day="28" classname="sec-2" open="17:20" noOfStudent="43"/>
<Hours close="11:10" day="21" classname="sec-3" open="17:20" noOfStudent="12"/>
<Hours close="11:10" day="1" classname="sec-4" open="17:20" noOfStudent="54"/>
<Hours close="11:10" day="25" classname="sec-5" open="17:20" noOfStudent="22"/>
<Hours close="11:10" day="1" classname="sec-6" open="17:20" noOfStudent="10"/> s
</ClassHours>XML-更新:
<ClassHours>
<Hours close="18:00" day="27" classname="sec-1" open="10:00" noOfStudent="23"/>
<Hours close="18:00" day="28" classname="sec-2" open="10:00" noOfStudent="43"/>
<Hours close="18:00" day="21" classname="sec-3" open="10:00" noOfStudent="12"/>
<Hours close="18:00" day="1" classname="sec-4" open="10:00" noOfStudent="54"/>
<Hours close="18:00" day="25" classname="sec-5" open="10:00" noOfStudent="22"/>
<Hours close="18:00" day="1" classname="sec-6" open="10:00" noOfStudent="10"/> s
</ClassHours>您可以注意到,父节点包含多个子节点。对于所有子节点,名称和属性是相同的,唯一的区别是Open和Close属性值。在这种情况下,输出是:
2019-12-24 19:53:28,093 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:53:28,093 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:53:28,093 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:53:28,093 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:53:28,093 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:53:28,095 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:53:28,096 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:53:28,096 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:53:28,096 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:53:28,096 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:53:28,097 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:53:28,097 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]案例-2:
XML-Original:
<ClassHours>
<Hours close="11:10" day="27" classname="sec-1" open="17:20" noOfStudent="23"/>
<Hours close="11:10" day="28" classname="sec-2" open="17:20" noOfStudent="43"/>
<Hours close="11:10" day="21" classname="sec-3" open="17:20" noOfStudent="12"/>
<Hours close="11:10" day="1" classname="sec-4" open="17:20" noOfStudent="54"/>
<Hours close="11:10" day="25" classname="sec-5" open="17:20" noOfStudent="22"/>
<Hours close="11:10" day="1" classname="sec-6" open="17:20" noOfStudent="10"/> s
</ClassHours>XML-Updated:
<ClassHours>
<Hours close="18:00" day="28" classname="sec-2" open="10:00" noOfStudent="43"/>
<Hours close="18:00" day="21" classname="sec-3" open="10:00" noOfStudent="12"/>
<Hours close="18:00" day="27" classname="sec-1" open="10:00" noOfStudent="23"/>
<Hours close="18:00" day="1" classname="sec-4" open="10:00" noOfStudent="54"/>
<Hours close="18:00" day="25" classname="sec-5" open="10:00" noOfStudent="22"/>
<Hours close="18:00" day="1" classname="sec-6" open="10:00" noOfStudent="10"/> s
</ClassHours>这里,对于所有子节点,名称和属性是相同的,区别在于Open和Close属性值。这一次,节点的顺序也被更新为类名,秒-3,行在sec-2之后移动。在这种情况下,输出是:
2019-12-24 19:54:31,737 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [classname], Before value : [sec-1], After value : [sec-2]]
2019-12-24 19:54:31,738 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:54:31,738 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [day], Before value : [27], After value : [28]]
2019-12-24 19:54:31,738 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [noOfStudent], Before value : [23], After value : [43]]
2019-12-24 19:54:31,738 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:54:31,740 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [classname], Before value : [sec-2], After value : [sec-3]]
2019-12-24 19:54:31,740 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:54:31,740 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [day], Before value : [28], After value : [21]]
2019-12-24 19:54:31,741 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [noOfStudent], Before value : [43], After value : [12]]
2019-12-24 19:54:31,741 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:54:31,741 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [classname], Before value : [sec-3], After value : [sec-1]]
2019-12-24 19:54:31,741 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:54:31,741 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [day], Before value : [21], After value : [27]]
2019-12-24 19:54:31,741 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [noOfStudent], Before value : [12], After value : [23]]
2019-12-24 19:54:31,742 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:54:31,742 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:54:31,742 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:54:31,742 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:54:31,742 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]
2019-12-24 19:54:31,742 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [close], Before value : [11:10], After value : [18:00]]
2019-12-24 19:54:31,742 INFO [main] (XMLDiffMain.java:107) - Node [/ClassHours/Hours, node attribute : [open], Before value : [17:20], After value : [10:00]]这里的输出是错误的,因为只在值上存在差异,但是XMLUnit也考虑了节点的顺序,并给出了这样的输出。
我的代码是:
LOGGER.debug("Comparing Actual and Expected XMLs");
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreAttributeOrder(true);
XMLUnit.setIgnoreComments(true);
DetailedDiff diff = new DetailedDiff(XMLUnit.compareXML(expectedXML, actualXML));
diff.overrideElementQualifier(new ElementNameAndAttributeQualifier());
return diff.getAllDifferences();谁能告诉我怎么解决这个问题吗?我也尝试过添加
diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
diff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());结果还是一样的。而且,我无法控制XML节点的顺序,因为它来自其他外部系统。在比较节点属性时,我需要让修复程序忽略序列。
而且,我已经提到过,这是XMLUnit无法工作的唯一情况。对于所有其他情况,它正在如预期的那样工作。
发布于 2019-12-25 10:39:24
您使用的是ElementNameAndAttributeQualifier的no-arg构造函数,这意味着如果两个元素的名称相同,并且它们的所有属性都具有相同的值,那么它们就有资格进行比较。对于示例中的任何一对元素都不是这样,因为close属性都是不同的。所以根本没有火柴。
在XMLUnit 1.x中,默认行为是将没有匹配合作伙伴的元素按文档顺序与测试文档中没有合作伙伴的元素匹配。因此,实际上,您是在按顺序比较元素。
您可以做的一件事是通过列出您希望在构造函数中保留相同值的属性来使ElementNameAndAttributeQualifier更加具体。您还可能希望将XMLUnit.setCompareUnmatched设置为false,这样您就不会被坏的默认情况所绊倒--或者更好的是,切换到与1.x不同的XMLUnit 2.x,与之不同的是,它是主动维护的,并且永远不会比较不匹配的节点。
https://stackoverflow.com/questions/59470597
复制相似问题