比较这两个XML片段:
testXml:
<ELEMENT1>
<CHILD1></CHILD1>
</ELEMENT1>
actualXml:
<ELEMENT1>
<CHILD1>notEmpty</CHILD1>
</ELEMENT1>
使用:
Diff diff = new Diff(testXml, actualXml);
Detailed detailedDiff = new DetailedDiff(diff);
现在detailedDiff.getAllDifferences();
将返回DifferenceConstants.HAS_CHILD_NODES_ID
差异,如果您将差异打印到控制台,它看起来像这样:
Expected presence of child nodes to be 'false' but was 'true' - comparing <CHILD1...> at /ELEMENT1[1]/CHILD1[1] to <CHILD1...> at /ELEMENT1[1]/CHILD1[1]
我的问题是,为什么DifferenceConstants.HAS_CHILD_NODES_ID
类型与DifferenceConstants.TEXT_VALUE_ID
类型不同?两个XML片段的结构是相同的,但两者的文本值不同。
那么,为什么不能引发差异?
答案 0 :(得分:2)
尝试使用此ElementQualifier
:
Diff diff = new Diff(testXml, actualXml);
diff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier() );
Detailed detailedDiff = new DetailedDiff(diff);
这是javadoc的描述:
public RecursiveElementNameAndTextQualifier()
使用元素名称和嵌套任意级别的子文本 更深入元素的元素来比较元素。检查所有 节点,而不仅仅是第一个子元素。 不会忽略空文本节点。
这里感兴趣的是“不忽略空文本节点”。
似乎默认ElementQualifier
将空节点视为缺失节点,并且仅检查与一个节点相关的第一个错误。所以在你的情况下,可能只抛出“HAS_CHILD_NODES_ID”,而不是也包括“TEXT_VALUE_ID”。
至少,RecursiveElementNameAndTextQualifier
更深入。