2015-12-10 23 views
0

我想比較兩個(org.jdom2.Document)xml文檔並將它們插入到我的xpath表達式中。如何在java中調用xpath deep-equal

String xpathExpression = "//[fn:deep-equal("+testDocument+","+ expectedDocument+")]"; 

這不會編譯。這是什麼適當的語法?

此外,我希望這個表達式返回一個布爾值。我是否應該使用

List<Text> textValues = xpath.evaluate(testDocument); 

才能得到結果?

+0

http://www.w3.org/TR/xquery-operators/#func-deep-equal返回一個布爾值,並採取兩個序列作爲它的參數。而'deep-equals'是XPath 2.0或更高版本,您是否將JDOM與XPath 2.0實現一起使用? –

+0

正確的語法只是「深度相等($ x,$ y)」。你的語法是錯誤的,因爲(a)你希望答案是一個布爾值,而不是某些滿足布爾值的節點集合的子集,(b)如果你確實需要一個謂詞來過濾一個節點集合,謂詞必須是有效的表達式,而「//」本身不是有效的表達式。 –

+0

@邁克爾凱我試過了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

回答

0

撒克遜在PE和EE版具有用於操作的方式的XPath 2.0評價針對JDOM節點,所以可以編寫XPath表達式deep-equal(., $doc2)其中上下文節點是所述第一文檔和可變doc2勢必對第二文檔支持:

Processor proc = new Processor(true); 
proc.getUnderlyingConfiguration().registerExternalObjectModel(JDOM2ObjectModel.getInstance()); 

DocumentBuilder db = proc.newDocumentBuilder(); 

Document doc1 = new Document(new Element("root", "This is a test")); 
Document doc2 = doc1.clone(); 

XdmNode xdmDoc1 = db.wrap(doc1); 
XdmNode xdmDoc2 = db.wrap(doc2); 

XPathCompiler xpath = proc.newXPathCompiler(); 
xpath.declareVariable(new QName("doc2")); 

XPathExecutable xx = xpath.compile("deep-equal(., $doc2)"); 

XPathSelector sel = xx.load(); 
sel.setContextItem(xdmDoc1); 
sel.setVariable(new QName("doc2"), xdmDoc2); 

XdmItem result = sel.evaluateSingle(); 

System.out.println(result.toString()); 
0

我找到了一種方法,將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());