2015-11-19 29 views
0

爲什麼以下xpath不會在Java中使用Saxon 9.6返回任何結果?使用Saxon進行XPath評估對於節點名稱不起作用

//field

奇怪的是我還評價//*和掛繞在與「場」比較節點名的結果,並得到了889個命中爲我的文件。

下面

全codeexample:

初始化和運行測試:

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(file); 


test(doc, "//*"); 
test(doc, "//field"); 

測試執行代碼:

private void test(Document doc, String xpathString) throws Exception { 
    System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); 
    XPathFactory xpf; 
    xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); 

    XPath xpath = xpf.newXPath(); 

    XPathExpression expr = xpath.compile(xpathString); 

    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 

    int fieldHits = 0; 
    for (int i = 0; i < nodes.getLength(); i++) { 
     Node node = nodes.item(i); 
     String name = node.getNodeName(); 
     fieldHits = "field".equals(nodes.item(i).getNodeName()) ? fieldHits + 1 : fieldHits; 
    } 

    System.out.println("#hits total: " + nodes.getLength()); 
    System.out.println("#hits 'field': " + fieldHits); 
} 

輸出:

#hits total: 26256 
#hits 'field': 889 
#hits total: 0 
#hits 'field': 0 

示例XML文檔(謝謝到WERO我現在知道它是與命名空間):

<?xml version="1.0" encoding="UTF-8"?> 
<?xfa generator="AdobeLiveCycleDesignerES_V9.0.1.0.20091206.1.615263" APIVersion="3.2.9310.0"?> 
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/" timeStamp="2015-11-17T07:12:49Z" uuid="262c190c-1563-4ae8-ae6e-4c8d59494a3c"> 
<template xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" xmlns="http://www.xfa.org/schema/xfa-template/2.8/"> 
    <field name="A"></field> 
    <field name="B"></field> 
    <field name="C"></field> 
    <field name="D"></field> 
    <field name="E"></field> 
    <field name="F"></field> 
</template> 
</xdp:xdp> 

回答

1

最有可能的解釋是,你field元素有一個非空的命名空間URI,因此不會被你的XPath表達式匹配。

編輯:

正如我猜你的文檔聲明默認的命名空間

xmlns="http://www.xfa.org/schema/xfa-template/2.8/" 

等等templatefield元素在該命名空間。

要匹配field元素,您或者需要tweak您的XPath查詢以聲明該名稱空間或僅搜索本地名稱。

+0

謝謝,它確實與名稱空間有關。現在我可以創建一個簡單的例子。你可以看看嗎? :) – sotix

+0

明白了,非常感謝:) – sotix

1

請注意,如果您要使用s9api接口而不是JAXP,則可以利用XPath 2.0中的功能爲XPath表達式中的元素名稱設置默認名稱空間。您的代碼將如下所示:

private void test(Document doc, String xpathString) throws Exception { 
    Processor proc = new Processor(false); 
    XdmNode docNode = proc.newDocumentBuilder().wrap(doc); 
    XPathCompiler xpath = proc.newXPathCompiler(); 
    xpath.declareNamespace("", "http://www.xfa.org/schema/xfa-template/2.8/"); 
    XdmValue result = xpath.evaluate(xpathString, docNode); 
    int fieldHits = 0; 
    for (XdmItem item : result) { 
     String name = ((XdmNode)node).getNodeName().getLocalName(); 
     fieldHits = "field".equals(name) ? fieldHits + 1 : fieldHits; 
    } 

    System.out.println("#hits total: " + nodes.getLength()); 
    System.out.println("#hits 'field': " + fieldHits); 
} 
+0

我不知道s9api,會看看它。謝謝 :) – sotix