XmlPath выбирает предшествующий / родительский атрибут - PullRequest
0 голосов
/ 29 июня 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>

Когда мне нужно извлечь Список всех ItineraryIds на основе дочернего элемента Flight, имеющего атрибут MultiLegOutboundFlight = "true"

Как мне написать XmlPath для достижения этой цели? Я использую RestAssoured и экспериментирую, но мне трудно найти ресурсы в Интернете для синтаксиса XmlPath, поэтому я проваливаюсь вслепую:

Если я сделаю следующее:

public List<String> getMultiLegFlightItineraryIdList() {
    XmlPath xmlPath = new XmlPath(response.asString()); if(xmlPath.getNode("Holiday.Flight").getAttribute("MultiLegOutboundFlight").equals("true")) {
        String itineraryId = xmlPath.getNode("Holiday").getAttribute("ItineraryId");
        System.out.println(itineraryId);
    }
    return itineraryIDList;
}

Тогда я получаю следующую ошибку:

[Fatal Error] :2:802: The markup in the document following the root element must be well-formed.
ERROR:  'The markup in the document following the root element must be well-formed.'

java.lang.IllegalArgumentException: Failed to convert XML to Java Object. If 
you're trying convert to a list then use the getList method instead.

Первоначально у меня было следующее:

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

Возвращает список всех праздников, в которых выполняется условие, но как получить атрибуты ItineraryID в качестве списка?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ниже может помочь фрагмент кода.

String itineraryId = "";
XmlPath xmlpath = new XmlPath(responseXML);
if(xmlpath.getNode("Holiday").getNode("Flight").getAttribute("MultiLegOutboundFlight").equals("true")) {
    itineraryId = xmlpath.getNode("Holiday").getAttribute("ItineraryId");
    System.out.println("Itinerary ID ::: "+itineraryId);
}

Импорт:

import com.jayway.restassured.path.xml.XmlPath;
0 голосов
/ 29 июня 2018

Это Xpath для вашего родительского узла,

//flight[@multilegoutboundflight='true']//parent::holiday

Что вам нужно дополнительно добавить, это метод, который будет извлекать внутренний атрибут. Так же, как мимоходом getAttribute('ItineraryId')

...