我正在加载一些像这样的XML字符串:
Document doc = getDocumentBuilder().parse(new InputSource(new StringReader(xml)));
Run Code Online (Sandbox Code Playgroud)
后来,我从中提取了一个节点Document:
XPath xpath = getXPathFactory().newXPath();
XPathExpression expr = xpath.compile(expressionXPATH);
NodeList nodeList = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
Node node = nodeList.item(0);
Run Code Online (Sandbox Code Playgroud)
现在我想得到这个节点的本地名称但是我得到了null.
node.getLocalName(); // return null
Run Code Online (Sandbox Code Playgroud)
使用调试器,我看到我的节点具有以下类型:DOCUMENT_POSITION_DISCONNECTED.
Javadoc声明getLocalName()返回null此类节点.
正如文档https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html#getLocalName()所述:
对于使用DOM Level 1方法创建的节点,[...]始终为null
所以一定要确保你知道使用一个命名空间DocumentBuilderFactory有setNamespaceAware(true),这样的DOM是支持名称空间感知的DOM级别2/3,将有一个非空值getLocalName().
一个简单的测试程序
String xml = "<root/>";
DocumentBuilderFactory db = DocumentBuilderFactory.newInstance();
Document dom1 = db.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
System.out.println(dom1.getDocumentElement().getLocalName() == null);
db.setNamespaceAware(true);
Document dom2 = db.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
System.out.println(dom2.getDocumentElement().getLocalName() == null);
Run Code Online (Sandbox Code Playgroud)
输出
true
false
Run Code Online (Sandbox Code Playgroud)
所以(至少)你的本地名称问题是由于使用DOM Level 1而不是名称空间感知文档(builder factory)引起的.