XmlPath выбирает список родительских атрибутов на основе условного дочернего атрибута в список строк - PullRequest
0 голосов
/ 01 июля 2018

С учетом следующего XML:

<Holiday ItineraryId="123456789" Country="ES" NumberOfNights="7" LeadInPricePerPassenger="447.3" FlightOnly="true" OneWayOnly="false" Currency="GBP" BookingChannel="WEB" PassengerIdRequired="false" PassengerIdMandatory="false" NationalityRequired="false" NationalityMandatory="false">
   <Flight OriginAirport="LGW" DestinationAirport="ALC" MultiLegOutboundFlight="true">
      <OutboundSubSegments DeparturePoint="LGW" DepartureDate="20180802" DepartureTime="0920" ArrivalPoint="OSL" ArrivalDate="20180802" ArrivalTime="1225" OperatingCarrier="DY" OperatedBy="Super Air Shuttle" FlightNumber="HY637" OriginAirportName="London Gatwick" DestinationAirportName="Oslo" />
   </Flight>
</Holiday>

<Holiday ItineraryId="9283873737" Country="ES" NumberOfNights="7" LeadInPricePerPassenger="447.3" FlightOnly="true" OneWayOnly="false" Currency="GBP" BookingChannel="WEB" PassengerIdRequired="false" PassengerIdMandatory="false" NationalityRequired="false" NationalityMandatory="false">
   <Flight OriginAirport="LGW" DestinationAirport="ALC" MultiLegOutboundFlight="true">
      <OutboundSubSegments DeparturePoint="LGW" DepartureDate="20180802" DepartureTime="0920" ArrivalPoint="OSL" ArrivalDate="20180802" ArrivalTime="1225" OperatingCarrier="DY" OperatedBy="Super Air Shuttle" FlightNumber="HY637" OriginAirportName="London Gatwick" DestinationAirportName="Oslo" />
   </Flight>
</Holiday>

<Holiday ItineraryId="894847463" Country="ES" NumberOfNights="7" LeadInPricePerPassenger="447.3" FlightOnly="true" OneWayOnly="false" Currency="GBP" BookingChannel="WEB" PassengerIdRequired="false" PassengerIdMandatory="false" NationalityRequired="false" NationalityMandatory="false">
   <Flight OriginAirport="LGW" DestinationAirport="ALC" MultiLegOutboundFlight="true">
      <OutboundSubSegments DeparturePoint="LGW" DepartureDate="20180802" DepartureTime="0920" ArrivalPoint="OSL" ArrivalDate="20180802" ArrivalTime="1225" OperatingCarrier="DY" OperatedBy="Super Air Shuttle" FlightNumber="HY637" OriginAirportName="London Gatwick" DestinationAirportName="Oslo" />
  </Flight>
</Holiday>

<Holiday ItineraryId="894847463" Country="ES" NumberOfNights="7" LeadInPricePerPassenger="447.3" FlightOnly="true" OneWayOnly="false" Currency="GBP" BookingChannel="WEB" PassengerIdRequired="false" PassengerIdMandatory="false" NationalityRequired="false" NationalityMandatory="false">
   <Flight OriginAirport="LGW" DestinationAirport="ALC" MultiLegOutboundFlight="false">
      <OutboundSubSegments DeparturePoint="LGW" DepartureDate="20180802" DepartureTime="0920" ArrivalPoint="OSL" ArrivalDate="20180802" ArrivalTime="1225" OperatingCarrier="DY" OperatedBy="Super Air Shuttle" FlightNumber="HY637" OriginAirportName="London Gatwick" DestinationAirportName="Oslo" />
  </Flight>
</Holiday>

Как выбрать все идентификаторы маршрута в списке строк, где выполняется условие MultiLegOutboundFlight = "true"?

Я пробовал:

allMultiLegPackages = response.xmlPath().getList("Holiday.Flight{it.@MultiLegOutboundFlight=='true'}//parent::Holiday");

... и это успешно возвращает список узлов, которые удовлетворяют условию. Но как мне получить список атрибутов ItineraryId?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Надеюсь, этот фрагмент поможет вам.

XmlPath xmlpath = new XmlPath(responseXML);
List<Node> holidayNodes = xmlpath.getList("Holidays.Holiday.findAll{it.Flight.@MultiLegOutboundFlight=='true'}");
List<String> itineraryList = new ArrayList<>();
for(Node node: holidayNodes){
itineraryList.add(node.getAttribute("ItineraryId"));
}
System.out.println(itineraryList);

Похоже, ваш XML-ответ имеет несколько корневых узлов Holiday. Я думаю, что у нас должен быть только один корневой узел. Объявите все праздничные узлы в одном корневом узле Holidays

0 голосов
/ 01 июля 2018

Предполагая, что ваше выражение XmlPath работает, я думаю, вам просто нужно добавить "/ @ ItineraryId" в конец его ... Так что-то вроде:

allMultiLegPackages =
response.xmlPath().getList("Holiday.Flight{it.@MultiLegOutboundFlight=='true'}//parent::Holiday/@ItineraryId");
...