简体   繁体   中英

Count number of occurrences in XML child node using simple_xml

Hi this is a webservice that return a listo of travel packages:

<offerlist>
        <id_o>154672521</id_o>
        <Pax>04</Pax>
        <FlightPackage>
            <Type>Circle</Type>
            <FlightSegment>
                <Direction>Outbound</Direction>
                <AvailabilityInfo>Available</AvailabilityInfo>
                <Id>20180316|FCO|HAV|BV1554|Y|</Id>
                <ProductType>ITC</ProductType>
                <Source>PressTours</Source>
                <AirlineCode>BV</AirlineCode>
                <AirlineName>Blue Panorama</AirlineName>
                <FlightNumber>BV1554</FlightNumber>
                <DepartureAirportIataCode>FCO</DepartureAirportIataCode>
                <ArrivalAirportIataCode>HAV</ArrivalAirportIataCode>
                <StopAirportIataCode>CYO</StopAirportIataCode>
                <DepartureDateTime>2018-03-16T08:00:00</DepartureDateTime>
                <ArrivalDateTime>2018-03-16T16:35:00</ArrivalDateTime>
                <ShamDateTime>false</ShamDateTime>
                <CabinClass>Y</CabinClass>
                <Warnings>
                    <Warning>
                        <Id>1</Id>
                        <Type>Critical</Type>
                        <Text>E' prevista una franchigia bagaglio etnica di 1 collo dal peso massimo di 32 kg per i passeggeri con passaporto cubano che viaggiano in classe Economica e di 2 colli dal peso massimo di 32kg cadauno per i passeggeri con passaporto cubano che viaggiano Comfort Class.</Text>
                        <StartingDate>2009-11-01T00:00:00</StartingDate>
                        <EndingDate>2100-01-01T00:00:00</EndingDate>
                    </Warning>
                    <Warning>
                        <Id>118</Id>
                        <Type>Critical</Type>
                        <Text>La richiesta impegnativa di posti eccedenti la nostra disponibilità pre-acquistata (puntino giallo), comporta un maggior costo in ragione della disponibilità di classe del vettore al momento della prenotazione. Il supplemento per la classe economy è di almeno € 35 per persona a tratta.</Text>
                        <StartingDate>1950-01-01T00:00:00</StartingDate>
                        <EndingDate>2050-12-31T00:00:00</EndingDate>
                    </Warning>
                </Warnings>
            </FlightSegment>
            <FlightSegment>
                <Direction>Inbound</Direction>
                <AvailabilityInfo>Available</AvailabilityInfo>
                <Id>20180329|HAV|FCO|NO0430.|Y|</Id>
                <ProductType>ITC</ProductType>
                <Source>PressTours</Source>
                <AirlineCode>NO</AirlineCode>
                <AirlineName>Neos</AirlineName>
                <FlightNumber>NO0430.</FlightNumber>
                <DepartureAirportIataCode>HAV</DepartureAirportIataCode>
                <ArrivalAirportIataCode>FCO</ArrivalAirportIataCode>
                <StopAirportIataCode>CUN</StopAirportIataCode>
                <DepartureDateTime>2018-03-29T19:40:00</DepartureDateTime>
                <ArrivalDateTime>2018-03-30T15:00:00</ArrivalDateTime>
                <ShamDateTime>false</ShamDateTime>
                <CabinClass>Y</CabinClass>
                <Warnings>
                    <Warning>
                        <Id>118</Id>
                        <Type>Critical</Type>
                        <Text>La richiesta impegnativa di posti eccedenti la nostra disponibilità pre-acquistata (puntino giallo), comporta un maggior costo in ragione della disponibilità di classe del vettore al momento della prenotazione. Il supplemento per la classe economy è di almeno € 35 per persona a tratta.</Text>
                        <StartingDate>1950-01-01T00:00:00</StartingDate>
                        <EndingDate>2050-12-31T00:00:00</EndingDate>
                    </Warning>
                    <Warning>
                        <Id>2</Id>
                        <Type>Critical</Type>
                        <Text>E' prevista una franchigia bagaglio etnica di 40 kg. E' necessario fornire il numero di passaporto.</Text>
                        <StartingDate>2009-11-01T00:00:00</StartingDate>
                        <EndingDate>2100-01-01T00:00:00</EndingDate>
                    </Warning>
                </Warnings>
            </FlightSegment>
        </FlightPackage>
        <Dest>Cuba</Dest>
        <Loc>Varadero</Loc>
        <Struct>Memories Varadero Beach Resort 4 Stelle</Struct>
        <idd>{b6a475f2-ef5e-4d9f-8cb7-a7d8dff43114}</idd>
        <idl>{55251786-7e22-4684-89b4-7e708df5527e}</idl>
        <ids>1VRASIRENIS</ids>
        <S_type>Pack</S_type>
        <Plan>AI</Plan>
        <DptDate>2018-03-16T00:00:00</DptDate>
        <days>15</days>
        <nights>13</nights>
        <dptapt>FCO</dptapt>
        <price>1632.12</price>
        <insur>160</insur>
        <visatx>213.69</visatx>
        <promo>: 0 €  sul valore del volo e dell'hotel   -  Condizioni  da Offerta  Vacanze ai Caraibi!!!: 8,00%  per persona a notte sul valore dell'hotel -  Condizioni  da Offerta</promo>
        <scontoapplicato>3,45% pari a Euro 58,24</scontoapplicato>
        <catoff>O</catoff>
        <commoff>11</commoff>
        <Status>M</Status>
        <modDate>2018-02-27T00:21:41</modDate>
        <av_from>0001-01-01T00:00:00</av_from>
        <av_to>0001-01-01T00:00:00</av_to>
    </offerlist>

i'm usign Larave to parse it from webservice $xml2 = simplexml_load_file($url) . I need to check if flights node have at least one filght with status Available, the i can import package, else not. Can someone explaim me how i can count occurrences with a specific value appear in childs?

You could do it using an xpath expression:

/offerlist/FlightPackage/FlightSegment/AvailabilityInfo[text() = 'Available']

For example:

$items = $xml2->xpath("/offerlist/FlightPackage/FlightSegment/AvailabilityInfo[text() = 'Available']");
echo count($items);

That would give you 2 for the xml in the example.

Demo

If you have multiple offerlists you might do it like this.

First get all the //offerlist and loop them getting the count:

$xml2 = simplexml_load_file("http://localhost/v1.xml");
$offerlists = $xml2->xpath("//offerlist");
foreach ($offerlists as $offerlist) {
    echo sprintf("Offerlist with id: %s has %s times 'Available'.<br>",
        $offerlist->id_o,
        count($offerlist->xpath("./FlightPackage/FlightSegment/AvailabilityInfo[text() = 'Available']"))
    );
}

Demo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM