当isNameSpaceAware和isValidating为“true”时,XPath为“Node”返回null

当我试图解析XML文件时,我得到一个空节点。

XPath xPath = XPathFactory.newInstance().newXPath(); Node node = null; try { node = (Node) xPath.evaluate( "/mynode", doc, XPathConstants.NODE); 

我只面对这个问题 –
1. DocumentBuilderFactory-setNameSpaceAware为true
2. DocumentBuilderFactory- setValidating为true。

如果这些设置为false,那么我得到的结果是正确的。 任何人都可以帮助我理解将这些属性设置为false的关系是什么? (我已经查过这个问题了,但这并不能说明我的疑问)

这是xml-

   TargetName desc goes here my.this my.ExampleObject   id ZZZ   ind X     childnodename description goes here  ALL   ALL   AAA    code1 code2     

最快的解决方法是不做setNamespaceAware(true); :-)但是,如果你想要一个名称空间感知XPath,那么你偶然发现了一个经典问题 – XPath:有没有办法为查询设置默认命名空间? ,因为XPath不支持默认命名空间的概念。

因此,您的XPath必须使用命名空间前缀,以便查询查找任何节点。 但是,您可以在XPath实例上设置NamespaceContext ,以将名称空间前缀或默认名称空间解析为URI。 一种方法,例如:

 import java.util.*; import java.io.ByteArrayInputStream; import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.*; import javax.xml.xpath.*; import org.w3c.dom.*; public class XmlParse { public static void main(String[] args) throws Exception { String xml = "" + "" + "TargetName" + ""; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes())); final String nonameNamespace = doc.getFirstChild().getNamespaceURI(); NamespaceContext ctx = new NamespaceContext() { public String getNamespaceURI(String prefix) { String uri = null; if (prefix.equals("n")) { uri = nonameNamespace; } return uri; } @Override public Iterator getPrefixes(String val) { throw new IllegalAccessError("Not implemented!"); } @Override public String getPrefix(String uri) { throw new IllegalAccessError("Not implemented!"); } }; XPath xPath = XPathFactory.newInstance().newXPath(); xPath.setNamespaceContext(ctx); Node node = null; try { node = (Node) xPath.evaluate("/n:mynode/n:name", doc, XPathConstants.NODE); System.out.println(node.getNodeName()); System.out.println(node.getFirstChild().getNodeValue()); } catch (Exception e) { } } } 

因此,当遇到具有n前缀的节点时,这将解析默认命名空间( xmlns )到http://www.example.com

XML是名称空间感知的。 每个XML元素(和属性)都有一个关联的命名空间; 如果没有指定,则为空(默认)命名空间。

在您的情况下,您尝试读取的XML文档可能使用名称空间,而您的XPath查询似乎只查询emtpy名称空间。 因此,您无法获得结果。 确保使用正确的命名空间,它将起作用。