Получение нулевых значений из запроса XPath - PullRequest
0 голосов
/ 29 августа 2018

У меня есть этот 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 голосов
/ 29 августа 2018

Проверьте документацию:

https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html

getNodeValue(), примененный к узлу элемента, возвращает ноль.

Использование getTextContent().

В качестве альтернативы, если вы находите DOM слишком расстраивающим, переключитесь на одну из лучших моделей дерева, такую ​​как JDOM2 или XOM.

Кроме того, если вы используете движок XPath 2.0, такой как Saxon, это (а) упростит ваше выражение до

//*:message-resource//*:code][contains(text(), 'account')]

и (b) позволяют вам возвращать последовательность строк из выражения XPath, а не последовательность узлов, поэтому вам не придется возиться со списками узлов.

Еще один момент: я подозреваю, что предикат [contains(text(), 'account')] действительно должен быть [.='account']. Я не уверен в этом, но использование text() вместо "." И использование contains() вместо "=" - обе распространенные ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...