我在下面有两个不同的XML文档,请注意它们具有相同的基本结构(模式)。
源 XML
<root>
<name>String</name>
<description>String</description>
</root>
测试XML
<root>
<name>Test</name>
<description></description> <!-- it is an empty node -->
</root>
我构建了这个代码片段函数来比较这两个 XML 文档。
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.Difference;
import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener;
import org.custommonkey.xmlunit.XMLUnit;
public static void main(String args[]) throws FileNotFoundException,
SAXException, IOException, ParserConfigurationException, XPathExpressionException {
String strSource = "<root><name>String</name><description>String</description></root>";
String strTest = "<root><name>Test</name><description></description></root>";
Document docSource = stringToXMLDocument(strSource);
Document docTest = stringToXMLDocument(strTest);
boolean result = isMatched(docSource, docTest);
if(result){
System.out.println("Matched!");
}else{
System.out.println("Un-matched!");
}
}
public static boolean isMatched(Document xmlSource, Document xmlCompareWith) {
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreComments(true);
XMLUnit.setIgnoreAttributeOrder(true);
XMLUnit.setNormalizeWhitespace(true);
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);
Diff myDiff = new Diff(xmlSource, xmlCompareWith);
myDiff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
return myDiff.similar();
}
public static Document stringToXMLDocument(String str) throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new InputSource(new StringReader(str)));
return document;
}
这是Maven依赖项
<dependency>
<groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId>
<version>1.6</version>
</dependency>
我希望这两个XML文档是相同的,但是该函数始终返回false。在比较两个XML结构时,有什么方法可以忽略节点文本值。如您所见,我已经使用了IgnoreTextAndAttributeValuesDifferenceListener,但我仍然遇到了问题。
您可能需要提供自己的DifferenceListener
,该委托给IgnoreTextAndAttributeValuesDifferenceListener
,此外还处理类型HAS_CHILDNODES
和CHILD_NODELIST_LENGTH
的差异。
正如 @scott-kurz 在 cmments 中指出的那样,可能根本没有任何 XMLText
节点,而不是空节点,具体取决于您的 XML 解析器及其配置。