Почему атрибуты не разбираются с помощью simplexml_load_string - PullRequest
0 голосов
/ 16 апреля 2019

я пытаюсь разобрать xml в массив вот мой пример xml

<?xml version="1.0" encoding="utf-8"?>
<Service_GetCancelPolicy>
    <GetCancelPolicy_Response>
        <ResNo>ELOKMA190410940</ResNo>
        <HBooking>HBMA1904000294</HBooking>
        <HotelId>WSASIDDPS001302</HotelId>
        <HotelName>Inna Bali Heritage Hotel</HotelName>
        <Policies>
            <Policy FromDate="2019-03-01" ToDate="2019-08-31">
                <RoomCatgCode Name="SULTAN" BFType="NONE">WSMA02045946</RoomCatgCode>
                <ExCancelDays>7</ExCancelDays>
                <ChargeType>Percent</ChargeType>
                <ChargeRate>80.00</ChargeRate>
                <Description></Description>
            </Policy>
        </Policies>
    </GetCancelPolicy_Response>
</Service_GetCancelPolicy>

вот результат массива, который я получаю

Array
(
    [GetCancelPolicy_Response] => Array
        (
            [ResNo] => ELOKMA190410940
            [HBooking] => HBMA1904000294
            [HotelId] => WSASIDDPS001302
            [HotelName] => Inna Bali Heritage Hotel
            [Policies] => Array
                (
                    [Policy] => Array
                        (
                            [@attributes] => Array
                                (
                                    [FromDate] => 2019-03-01
                                    [ToDate] => 2019-08-31
                                )

                            [RoomCatgCode] => WSMA02045946
                            [ExCancelDays] => 7
                            [ChargeType] => Percent
                            [ChargeRate] => 80.00
                            [Description] => Array
                                (
                                )

                        )

                )

        )

)

И вот как я это делаю

$xml = '<?xml version="1.0" encoding="utf-8"?><Service_GetCancelPolicy><GetCancelPolicy_Response><ResNo>ELOKMA190410940</ResNo><HBooking>HBMA1904000294</HBooking><HotelId>WSASIDDPS001302</HotelId><HotelName>Inna Bali Heritage Hotel</HotelName><Policies><Policy FromDate="2019-03-01" ToDate="2019-08-31"><RoomCatgCode Name="SULTAN" BFType="NONE">WSMA02045946</RoomCatgCode><ExCancelDays>7</ExCancelDays><ChargeType>Percent</ChargeType><ChargeRate>80.00</ChargeRate><Description></Description></Policy></Policies></GetCancelPolicy_Response></Service_GetCancelPolicy>';

$xml = simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

print_r($array);

мой вопрос, почему атрибуты RoomCatgCode, которые включают Name и BFType, не отображаются в массиве?если значение RoomCatgCode (WSMA02045946) отсутствует, то атрибуты RoomCatgCode находятся в массиве результатов, например атрибуты Policy FromDate и ToDate

Может кто-нибудь подсказать мне, как успешно преобразовать этот xml в массив?спасибо.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Вы можете использовать xml_parser_create() для создания нового парсера XML.Используйте xml_parse_into_struct() для разбора ваших XML-данных в структуру массива.

<code><?php
$xml = '<?xml version="1.0" encoding="utf-8"?><Service_GetCancelPolicy><GetCancelPolicy_Response><ResNo>ELOKMA190410940</ResNo><HBooking>HBMA1904000294</HBooking><HotelId>WSASIDDPS001302</HotelId><HotelName>Inna Bali Heritage Hotel</HotelName><Policies><Policy FromDate="2019-03-01" ToDate="2019-08-31"><RoomCatgCode Name="SULTAN" BFType="NONE">WSMA02045946</RoomCatgCode><ExCancelDays>7</ExCancelDays><ChargeType>Percent</ChargeType><ChargeRate>80.00</ChargeRate><Description></Description></Policy></Policies></GetCancelPolicy_Response></Service_GetCancelPolicy>';

$handle = xml_parser_create();
/* Parse XML data into an array structure */
xml_parse_into_struct($handle, $xml, $values);
xml_parser_free($handle);

echo '<pre>';
var_dump($values);
echo '
';

// Вывод:

...

[8]=>
  array(5) {
    ["tag"]=>
    string(12) "ROOMCATGCODE"
    ["type"]=>
    string(8) "complete"
    ["level"]=>
    int(5)
    ["attributes"]=>
    array(2) {
      ["NAME"]=>
      string(6) "SULTAN"
      ["BFTYPE"]=>
      string(4) "NONE"
    }
    ["value"]=>
    string(12) "WSMA02045946"

...
0 голосов
/ 16 апреля 2019

var_dump и print_r не показывают вложенные объекты.Попробуйте это:

$xml = '<?xml version="1.0" encoding="utf-8"?><Service_GetCancelPolicy><GetCanc$

$result = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);

foreach ($result[0]->children()[0] as $elem) {
   foreach($elem->children()[0] as $x) {
        var_dump($x);
   }
}

, и вы увидите атрибуты RoomCatgCode

...