Xml распарсить

Discussion in 'PHP' started by -=Zhenek=-, 20 Dec 2011.

  1. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Добрый день.. Подскажите..

    имеется xml фаил

    формата:

    PHP:
    <AirAvailabilityResults size="99">
    <
    AirAvailabilityReply>
    <
    supplierType>
    S
    </supplierType>
    <
    RateInfo>
    <
    nativeBaseFare>
    907.0
    </nativeBaseFare>
    <
    nativeTotalPrice>
    930.1
    </nativeTotalPrice>
    <
    nativeCurrencyCode>
    USD
    </nativeCurrencyCode>
    <
    displayBaseFare>
    907.0
    </displayBaseFare>
    <
    displayTotalPrice>
    930.1
    </displayTotalPrice>
    <
    displayCurrencyCode>
    USD
    </displayCurrencyCode>
    </
    RateInfo>
    <
    FlightSegment>
    <
    segmentOutgoing>
    true
    </segmentOutgoing>
    <
    airlineCode>
    EK
    </airlineCode>
    <
    airline>
    EMIRATES AIRLINES
    </airline>
    <
    flightNumber>
    132
    </flightNumber>
    <
    originCityCode>
    DME
    </originCityCode>
    <
    destinationCityCode>
    DXB
    </destinationCityCode>
    <
    departureDateTime>
    02/19/2012 1:05 AM
    </departureDateTime>
    <
    arrivalDateTime>
    02/19/2012 6:20 AM
    </arrivalDateTime>
    <
    fareClass>
     
    X
    </fareClass>
    <
    equipmentCode>
    77W
    </equipmentCode>
    <
    numberOfStops>
    0
    </numberOfStops>
    <
    originCity>
    Moscow
    </originCity>
    <
    originStateProvince/>
    <
    originCountry>
    RU
    </originCountry>
    <
    destinationCity>
    Dubai
    </destinationCity>
    <
    desintationStateProvince/>
    <
    destinationCountry>
    AE
    </destinationCountry>
    </
    FlightSegment>
    <
    FlightSegment>
    <
    segmentOutgoing>
    true
    </segmentOutgoing>
    <
    airlineCode>
    EK
    </airlineCode>
    <
    airline>
    EMIRATES AIRLINES
    </airline>
    <
    flightNumber>
    358
    </flightNumber>
    <
    originCityCode>
    DXB
    </originCityCode>
    <
    destinationCityCode>
    CGK
    </destinationCityCode>
    <
    departureDateTime>
    02/19/2012 10:30 AM
    </departureDateTime>
    <
    arrivalDateTime>
    02/19/2012 9:35 PM
    </arrivalDateTime>
    <
    fareClass>
     
    X
    </fareClass>
    <
    equipmentCode>
    77W
    </equipmentCode>
    <
    numberOfStops>
    0
    </numberOfStops>
    <
    originCity>
    Dubai
    </originCity>
    <
    originStateProvince/>
    <
    originCountry>
    AE
    </originCountry>
    <
    destinationCity>
    Jakarta
    </destinationCity>
    <
    desintationStateProvince/>
    <
    destinationCountry>
    ID
    </destinationCountry>
    </
    FlightSegment>
    <
    FlightSegment>
    <
    segmentOutgoing>
    true
    </segmentOutgoing>
    <
    airlineCode>
    GA
    </airlineCode>
    <
    airline>
    GARUDA INDONESIA
    </airline>
    <
    flightNumber>
    404
    </flightNumber>
    <
    originCityCode>
    CGK
    </originCityCode>
    <
    destinationCityCode>
    DPS
    </destinationCityCode>
    <
    departureDateTime>
    02/20/2012 9:55 AM
    </departureDateTime>
    <
    arrivalDateTime>
    02/20/2012 12:40 PM
    </arrivalDateTime>
    <
    fareClass>
     
    L
    </fareClass>
    <
    equipmentCode>
    738
    </equipmentCode>
    <
    numberOfStops>
    0
    </numberOfStops>
    <
    originCity>
    Jakarta
    </originCity>
    <
    originStateProvince/>
    <
    originCountry>
    ID
    </originCountry>
    <
    destinationCity>
    Denpasar Bali
    </destinationCity>
    <
    desintationStateProvince/>
    <
    destinationCountry>
    ID
    </destinationCountry>
    </
    FlightSegment>
    <
    FlightSegment>
    <
    segmentOutgoing>
    false
    </segmentOutgoing>
    <
    airlineCode>
    MH
    </airlineCode>
    <
    airline>
    MALAYSIAN AIRLINES
    </airline>
    <
    flightNumber>
    852
    </flightNumber>
    <
    originCityCode>
    DPS
    </originCityCode>
    <
    destinationCityCode>
    KUL
    </destinationCityCode>
    <
    departureDateTime>
    02/23/2012 7:15 PM
    </departureDateTime>
    <
    arrivalDateTime>
    02/23/2012 10:10 PM
    </arrivalDateTime>
    <
    fareClass>
     
    S
    </fareClass>
    <
    equipmentCode>
    738
    </equipmentCode>
    <
    numberOfStops>
    0
    </numberOfStops>
    <
    originCity>
    Denpasar Bali
    </originCity>
    <
    originStateProvince/>
    <
    originCountry>
    ID
    </originCountry>
    <
    destinationCity>
    Kuala Lumpur
    </destinationCity>
    <
    desintationStateProvince/>
    <
    destinationCountry>
    MY
    </destinationCountry>
    </
    FlightSegment>
    <
    FlightSegment>
    <
    segmentOutgoing>
    false
    </segmentOutgoing>
    <
    airlineCode>
    EK
    </airlineCode>
    <
    airline>
    EMIRATES AIRLINES
    </airline>
    <
    flightNumber>
    343
    </flightNumber>
    <
    originCityCode>
    KUL
    </originCityCode>
    <
    destinationCityCode>
    DXB
    </destinationCityCode>
    <
    departureDateTime>
    02/24/2012 2:00 AM
    </departureDateTime>
    <
    arrivalDateTime>
    02/24/2012 5:10 AM
    </arrivalDateTime>
    <
    fareClass>
     
    X
    </fareClass>
    <
    equipmentCode>
    773
    </equipmentCode>
    <
    numberOfStops>
    0
    </numberOfStops>
    <
    originCity>
    Kuala Lumpur
    </originCity>
    <
    originStateProvince/>
    <
    originCountry>
    MY
    </originCountry>
    <
    destinationCity>
    Dubai
    </destinationCity>
    <
    desintationStateProvince/>
    <
    destinationCountry>
    AE
    </destinationCountry>
    </
    FlightSegment>
    <
    FlightSegment>
    <
    segmentOutgoing>
    false
    </segmentOutgoing>
    <
    airlineCode>
    EK
    </airlineCode>
    <
    airline>
    EMIRATES AIRLINES
    </airline>
    <
    flightNumber>
    133
    </flightNumber>
    <
    originCityCode>
    DXB
    </originCityCode>
    <
    destinationCityCode>
    DME
    </destinationCityCode>
    <
    departureDateTime>
    02/24/2012 9:35 AM
    </departureDateTime>
    <
    arrivalDateTime>
    02/24/2012 3:00 PM
    </arrivalDateTime>
    <
    fareClass>
     
    X
    </fareClass>
    <
    equipmentCode>
    345
    </equipmentCode>
    <
    numberOfStops>
    0
    </numberOfStops>
    <
    originCity>
    Dubai
    </originCity>
    <
    originStateProvince/>
    <
    originCountry>
    AE
    </originCountry>
    <
    destinationCity>
    Moscow
    </destinationCity>
    <
    desintationStateProvince/>
    <
    destinationCountry>
    RU
    </destinationCountry>
    </
    FlightSegment>
    <
    tripType>
    R
    </tripType>
    <
    ticketType>
    E
    </ticketType>
    </
    AirAvailabilityReply>
    </
    AirAvailabilityResults>
    В данном случае в контейнере <AirAvailabilityResults size="99">
    Находится много (в этом запросе 99) контейнеров <AirAvailabilityReply>

    Который содержат контейнер <RateInfo> и в нем контейнер <displayTotalPrice>
    и несколько контейнеров <FlightSegment> тоже с информацией

    как получить массив например чтоб достать displayTotalPrice
    [0][RateInfo][displayTotalPrice]
    где ноль это первый контейнер AirAvailabilityReply

    То есть удобный массив с которым я могу работать..

    пробовал так:

    PHP:
    //создаём XML-разборщик
    $xml xml_parser_create(); 
     
    $rr curl_multi_getcontent($ch1);
    //устанавливаем опции XML-разборщика
    xml_parser_set_option($xmlXML_OPTION_SKIP_WHITE1); 
     
    //разбираем XML-данные в структуру массива $xml_array
    xml_parse_into_struct($xml,$rr$element$xml_array); 
     
    //освобождаем XML-разборщик
    xml_parser_free($xml);
    print_r($xml_array);
    Выводит не удобный массив вида:

    PHP:
    [0] => Array
            (
                [
    tag] => AIRAVAILABILITYRESULTS
                
    [type] => open
                
    [level] => 1
                
    [attributes] => Array
                    (
                        [
    SIZE] => 99
                    
    )

            )
    То есть 1 блок это открывающий тег
    второй блок еще с чем-то потом еще что-то и закрывающий тег.
    Работать с таким массивом не удобно, учитывая что блоков 99 и больше и в каждом из них еще по 6-10 блоков.
     
  2. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    XPath не поможет?
    PHP:
    <?php
      $xml 
    simplexml_load_file ('2.xml');
      
    $xpath $xml->xpath ('//AirAvailabilityReply/RateInfo/displayTotalPrice');
      foreach (
    $xpath as $val)
        echo 
    trim ($val), "\n";
    ?>
     
  3. Zoo

    Zoo New Member

    Joined:
    10 Jun 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Думаю SimpleXML идеально и предельно просто справиться с задачей. http://php.net/manual/ru/book.simplexml.php