Получение блока XML по селектору

178
17 сентября 2019, 21:20

Я использую 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> = rain?

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

У меня получается получить значения атрибута используя метод getTextContent(), но такой способ мне кажется плохим, потому что если нужно будет получить значения двух атрибутов - придется писать два селектора и дважды получать результат:

        private final String XPATH_PATTERN = "//hourly[tempC>0]";
        InputStream response = given().when().get(URL).asInputStream();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(response);
        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xpath = xPathFactory.newXPath();
        XPathExpression expr = xpath.compile(XPATH_PATTERN);
        Object resuslt = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) resuslt;
        for(int i = 4; i < nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getTextContent()); //возвращает нужные мне значения, но этот способ плох
        System.out.println(nodes.item(i).getAttributes().getNamedItem("tempC")); //возвращает null
        }

Как из оставшихся узлов hourly получить нужные атрибуты?

Answer 1

Вы можете использовать примерно такой XPath: //hourly[tempC>0 and weatherDesc='rain']
См.: https://www.w3schools.com/xml/xpath_intro.asp
https://www.baeldung.com/java-xpath

READ ALSO
Дубликат кода JAVA

Дубликат кода JAVA

Есть приложение, состоящее из нескольких maven-modulesВ каждом модуле есть Класс, который просто заполняет, хранит и в методах возвращает два List<>

112
Передача значения объекта из Java в с++

Передача значения объекта из Java в с++

Читаю книгу про компиляторы(книга дракона), разбираюсь как лексические и синтаксические анализаторы программируютсяВ конце книги есть пример...

146
Синхронизация данных в базах данных

Синхронизация данных в базах данных

Хочу импленментировать синхронизацию баз данных между удаленными машинамиВсе происходит так: embedded система собирает данные и при возможности...

141
О нотация, разбор определения

О нотация, разбор определения

Читаю Седживка, до этого момента было все понятно:

109