我找到了一種方法,將xml文件轉換爲字符串,然後使用org.custommonkey。 xmlunit來區分字符串。
POM
<dependency>
<groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId>
<version>1.6</version>
</dependency
測試
...
String test = xmlToString(testXml);
String expected = xmlToString(expectedXml);
...
Diff xmlDiff = new Diff(expected, test);
assertTrue(xmlDiff.similar());
...
XML轉換爲字符串
private String xmlToString(File xml)
throws FileNotFoundException, IOException {
BufferedReader br = new BufferedReader(new FileReader(xml));
String line;
StringBuilder sb = new StringBuilder();
while((line=br.readLine())!= null){
sb.append(line.trim());
}
br.close();
return sb.toString();
}
的差異可定製
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreComments(true);
XMLUnit.setIgnoreAttributeOrder(true);
Diff xmlDiff = new Diff(expected, test);
xmlDiff.overrideDifferenceListener(new DifferenceListener() {
@Override
public int differenceFound(Difference diff) {
System.err.println("called: " + diff);
int diffResult = RETURN_ACCEPT_DIFFERENCE;
//ignore a node difference
if(diff.getControlNodeDetail().getNode().getParentNode().getNodeName().contains("myNodeName")){
skippedComparison(diff.getControlNodeDetail().getNode().getParentNode(), diff.getTestNodeDetail().getNode().getParentNode());
diffResult = RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
}
return diffResult;
}
@Override
public void skippedComparison(Node arg0, Node arg1) {}
});
assertTrue(xmlDiff.similar());
來源
2015-12-22 16:14:25
Jim
http://www.w3.org/TR/xquery-operators/#func-deep-equal返回一個布爾值,並採取兩個序列作爲它的參數。而'deep-equals'是XPath 2.0或更高版本,您是否將JDOM與XPath 2.0實現一起使用? –
正確的語法只是「深度相等($ x,$ y)」。你的語法是錯誤的,因爲(a)你希望答案是一個布爾值,而不是某些滿足布爾值的節點集合的子集,(b)如果你確實需要一個謂詞來過濾一個節點集合,謂詞必須是有效的表達式,而「//」本身不是有效的表達式。 –
@邁克爾凱我試過了String xpathExpression = String.format(「deep-equal(%s,%s)」,testDocument,expectedDocument);這兩個文件都被填充。我得到一個XPathSyntaxException:導致:org.jaxen.saxpath.XPathSyntaxException:深相等([Document:沒有DOCTYPE聲明,Root是[Element:]],[Document:沒有DOCTYPE聲明,Root是[Element: ]]:11:意外'[' –
Jim