2011-08-21 110 views
3

我正在嘗試使用XPath中的namespace-uri()函數根據完全限定的名稱檢索節點。其中this online XPath tester中的查詢//*[local-name() = 'customerName' and namespace-uri() = 'http://example.com/officeN']正確地返回相關節點。然而,下面的自包含Java類不會檢索任何內容。我在做什麼錯誤namespace-uri()爲什麼XPath namespace-uri()不能與Java一起使用?

import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
public class Test{ 
    public static void main(String[] args)throws Exception { 

     XPathExpression expr = XPathFactory.newInstance().newXPath().compile(
       "//*[local-name() = 'customerName' and namespace-uri() = 'http://example.com/officeN']"); 
     String xml= 
      "<Agents xmlns:n=\"http://example.com/officeN\">\n"+ 
      "\t<n:Agent>\n\t\t<n:customerName>Joe Shmo</n:customerName>\n\t</n:Agent>\n"+ 
      "\t<n:Agent>\n\t\t<n:customerName>Mary Brown</n:customerName>\n\t</n:Agent>\n</Agents>"; 
     System.out.println(xml); 
     Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xml))); 
     NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
     System.err.println("\n\nNodes:"); 
     for (int i = 0; i < nodes.getLength(); i++) { 
      System.err.println(nodes.item(i)); 

     } 
    } 
} 
+0

謝謝你這篇文章!它真的有助於使用XPath的namespace-uri。 –

回答

3

該查詢看起來很好。您還需要將您的DocumentBuilderFactory聲明爲「名稱空間感知」。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); 
+0

謝謝!這正是我需要的! –

+0

不客氣! :) – emboss

相關問題