从XPath查询获取空值

时间:2018-08-29 16:51:51

标签: 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运算符)

1 个答案:

答案 0 :(得分:3)

查看文档:

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()代替“ =”是常见的错误。

相关问题