java - 从 XPath 查询中获取空值

标签 java xml xpath

我有这个 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/

相关文章:

java - 在调用 getResource() 之前,我是否需要在 getClassLoader() 上处理 null

java - 当显示大量项目和 View 时,javafx 中的滚动 Pane 会增加 RAM 的负担

java - 如何从java代码执行批量存储过程调用?

python - 如何将网站的多个部分中的多个属性映射为 scrapy 项目?

python - 如何通过 Python 使用 Selenium 单击此按钮

java - 为服务器端设置 gcm

c# - 如何反序列化 SOAP 响应?

php - AS3 共享对象未正确刷新和 XML/PHP

java - 在 strings.xml 中找不到所有可翻译的字符串 - Android Studio

selenium - 使用 selenium 提取网站的面包屑