我有这个 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<iet:aw-data xmlns:iet="http://care.aw.com/IET/2007/12" class="com.aw.care.bean.resource.MessageResource">
<iet:metadata filter=""/>
<iet:message-resource>
<iet:message>some message 1</iet:message>
<iet:customer id="1"/>
<iet:code>edi.claimfilingindicator.11</iet:code>
<iet:locale>iw_IL</iet:locale>
</iet:message-resource>
<iet:message-resource>
<iet:message>some message 2</iet:message>
<iet:customer id="1"/>
<iet:code>edi.claimfilingindicator.12</iet:code>
<iet:locale>iw_IL</iet:locale>
</iet:message-resource>
.
.
.
.
</iet:aw-data>
使用下面的代码我可以获取数据并找到我需要的内容。
try {
FileInputStream fileIS = new FileInputStream(new File("resources\\bootstrap\\content\\MessageResources_iw_IL\\MessageResource_iw_IL.ctdata.xml"));
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document xmlDocument = builder.parse(fileIS);
XPath xPath = XPathFactory.newInstance().newXPath();
String query = "//*[local-name()='message-resource']//*[local-name()='code'][contains(text(), 'account')]";
NodeList nodeList = (NodeList) xPath.compile(query).evaluate(xmlDocument, XPathConstants.NODESET);
System.out.println("size= " + nodeList.getLength());
for (int i = 0; i < nodeList.getLength(); i++) {
System.out.println(nodeList.item(i).getNodeValue());
}
}
catch (Exception e){
e.printStackTrace();
}
问题是我在 for 循环中打印时只得到空值,知道为什么会发生这种情况吗?
代码需要返回一个节点列表,其中包含包含给定参数的代码和消息字段(与带有两个参数的 SQL 查询相同,参数之间带有 AND 运算符)
最佳答案
检查文档:
https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html
应用于元素节点的getNodeValue()
返回 null。
使用getTextContent()
。
或者,如果您发现 DOM 太令人沮丧,请切换到更好的树模型之一,例如 JDOM2 或 XOM。
此外,如果您使用像 Saxon 这样的 XPath 2.0 引擎,它会 (a) 将您的表达式简化为
//*:message-resource//*:code][contains(text(), 'account')]
和 (b) 允许您从 XPath 表达式返回字符串序列,而不是节点序列,因此您不必搞乱节点列表。
另一点:我怀疑谓词[contains(text(), 'account')]
实际上应该是[.='account']
。我不确定,但是使用 text()
而不是“.”,以及使用 contains()
而不是“=”,都是常见的错误。
关于java - 从 XPath 查询中获取空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082531/