2011-08-21 108 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

相关问题