Получение узла из документа XML - PullRequest
0 голосов
/ 04 февраля 2019

Я использую worldweatheronline API. Служба выдает xml в следующей форме:

<hourly>
  <tempC>-3</tempC>
  <weatherDesc>rain</weatherDesc>
  <precipMM>0.0</precipMM>
</hourly>
<hourly>
  <tempC>5</tempC>
  <weatherDesc>no</weatherDesc>
  <precipMM>0.1</precipMM>
</hourly>
  1. Можно ли каким-то образом получить все узлы <hourly> вкоторые <tempC>> 0 и <weatherDesc> = дождь?

  2. Как исключить из ответа неинтересные мне узлы <hourly>?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Это вполне возможно при использовании XPath .
. Вы можете фильтровать документ на основе значений элементов, значений атрибутов и других критериев.Вот рабочий пример, который получает элементы в соответствии с первым пунктом в вопросе:

    try (InputStream is = Files.newInputStream(Paths.get("C:/temp/test.xml"))) {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document xmlDocument = builder.parse(is);
        XPath xPath = XPathFactory.newInstance().newXPath();
        // get hourly elements that have tempC child element with value > 0 and weatherDesc child element with value = "rain"
        String expression = "//hourly[tempC>0 and weatherDesc=\"rain\"]";
        NodeList hours = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
        for (int i = 0; i < hours.getLength(); i++) {
            System.out.println(hours.item(i) + " " + hours.item(i).getTextContent());
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
0 голосов
/ 04 февраля 2019

Я думаю, вы должны создать xsd из xml и сгенерировать классы JAXB. Используя эти классы JAXB, вы можете легко демонтировать xml и обрабатывать свою логику.

...