XML / PHP到数组问题

时间:2011-07-07 09:50:15

标签: php xml arrays multidimensional-array

我现在已经把头发撕掉了几个小时,以为我会把它张贴在这里看看是否有人有任何建议。

基本上我通过SOAP / Curl调用接收一些XML日期,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <LocationAvailabilityResponse xmlns="">
            <getAvailabilityReturn>
                <errors />
                    <requestID>389851</requestID>
                        <hotels>
                            <hotels>
                                <hotel>
                                    <apt>false</apt>
                                    <distance>0</distance>
                                    <fromPrice>18.5</fromPrice>
                                    <hotelName>Britannia Hotel Stockport</hotelName>
                                    <id>5165</id>
                                    <images>
                                        <images>
                                            <hasThumbnail>true</hasThumbnail>
                                            <height>187</height>
                                            <thumbnailHeight>50</thumbnailHeight>
                                            <thumbnailURL>http://static.superbreak.net/content/images/Hotel/thumbs/britannia_hotel_stockport_swimming_pool_1_swi_5165.JPG</thumbnailURL>
                                            <thumbnailWidth>68</thumbnailWidth>
                                            <title>Britannia Hotel Stockport</title>
                                            <url>http://static.superbreak.net/content/images/Hotel/britannia_hotel_stockport_swimming_pool_1_swi_5165.JPG</url>
                                            <width>257</width>
                                        </images>
                                        <images>
                                            <hasThumbnail>false</hasThumbnail>
                                            <height>187</height>
                                            <thumbnailHeight>0</thumbnailHeight>
                                            <thumbnailURL>http://static.superbreak.net/content/images/Hotel/thumbs/britannia_hotel_stockport_swimming_pool_2_swi_5165.JPG</thumbnailURL>
                                            <thumbnailWidth>0</thumbnailWidth>
                                            <title>Swimming Pool</title>
                                            <url>http://static.superbreak.net/content/images/Hotel/britannia_hotel_stockport_swimming_pool_2_swi_5165.JPG</url>
                                            <width>257</width>
                                        </images>
                                        <images>
                                            <hasThumbnail>false</hasThumbnail>
                                            <height>187</height>
                                            <thumbnailHeight>0</thumbnailHeight>
                                            <thumbnailURL>http://static.superbreak.net/content/images/Hotel/thumbs/britannia_hotel_stockport_hotel_entrance_1_ent_5165.JPG</thumbnailURL>
                                            <thumbnailWidth>0</thumbnailWidth>
                                            <title>Hotel Entrance</title>
                                            <url>http://static.superbreak.net/content/images/Hotel/britannia_hotel_stockport_hotel_entrance_1_ent_5165.JPG</url>
                                            <width>257</width>
                                        </images>
                                        <images>
                                            <hasThumbnail>false</hasThumbnail>
                                            <height>187</height>
                                            <thumbnailHeight>0</thumbnailHeight>
                                            <thumbnailURL>http://static.superbreak.net/content/images/Hotel/thumbs/britannia_hotel_stockport_hotel_gym_1_gym_5165.JPG</thumbnailURL>
                                            <thumbnailWidth>0</thumbnailWidth>
                                            <title>Hotel Gym</title>
                                            <url>http://static.superbreak.net/content/images/Hotel/britannia_hotel_stockport_hotel_gym_1_gym_5165.JPG</url>
                                            <width>257</width>
                                        </images>
                                        <images>
                                            <hasThumbnail>false</hasThumbnail>
                                            <height>187</height>
                                            <thumbnailHeight>0</thumbnailHeight>
                                            <thumbnailURL>http://static.superbreak.net/content/images/Hotel/thumbs/britannia_hotel_stockport_hotel_lounge_1_lou_5165.JPG</thumbnailURL>
                                            <thumbnailWidth>0</thumbnailWidth>
                                            <title>Hotel Lounge</title>
                                            <url>http://static.superbreak.net/content/images/Hotel/britannia_hotel_stockport_hotel_lounge_1_lou_5165.JPG</url>
                                            <width>257</width>
                                        </images>
                                        <images>
                                            <hasThumbnail>false</hasThumbnail>
                                            <height>187</height>
                                            <thumbnailHeight>0</thumbnailHeight>
                                            <thumbnailURL>http://static.superbreak.net/content/images/Hotel/thumbs/britannia_hotel_stockport_four_poster_bedroom_1_pst_5165.JPG</thumbnailURL>
                                            <thumbnailWidth>0</thumbnailWidth>
                                            <title>Four Poster Bedroom</title>
                                            <url>http://static.superbreak.net/content/images/Hotel/britannia_hotel_stockport_four_poster_bedroom_1_pst_5165.JPG</url>
                                            <width>257</width>
                                        </images>
                                        </images>
                                    <latitude>53.398941</latitude>
                                    <location>Stockport</location>
                                    <longitude>-2.13463</longitude>
                                    <starRating>3</starRating>
                                    </hotel>
                                <roomUnits>
                                    <roomUnits>
                                        <allocation>1</allocation>
                                        <boardCode>RO</boardCode>
                                        <boardDescription>Room only</boardDescription>
                                        <maxOccupancy>2</maxOccupancy>
                                        <minOccupancy>1</minOccupancy>
                                        <price>18.5</price>
                                        <stdOccupancy>2</stdOccupancy>
                                        <unitDescription>Double For 1-2</unitDescription>
                                        <unitID>162</unitID>
                                    </roomUnits>
                                    <roomUnits>
                                        <allocation>1</allocation>
                                        <boardCode>RO</boardCode>
                                        <boardDescription>Room only</boardDescription>
                                        <maxOccupancy>2</maxOccupancy>
                                        <minOccupancy>1</minOccupancy>
                                        <price>18.5</price>
                                        <stdOccupancy>2</stdOccupancy>
                                        <unitDescription>Twin For 1-2</unitDescription>
                                        <unitID>161</unitID>
                                    </roomUnits>
                                    <roomUnits>
                                        <allocation>1</allocation>
                                        <boardCode>RO</boardCode>
                                        <boardDescription>Room only</boardDescription>
                                        <maxOccupancy>2</maxOccupancy>
                                        <minOccupancy>2</minOccupancy>
                                        <price>23.5</price>
                                        <stdOccupancy>2</stdOccupancy>
                                        <unitDescription>Executive Double Room</unitDescription>
                                        <unitID>65</unitID>
                                    </roomUnits>
                                    <roomUnits>
                                        <allocation>1</allocation>
                                        <boardCode>RO</boardCode>
                                        <boardDescription>Room only</boardDescription>
                                        <maxOccupancy>2</maxOccupancy>
                                        <minOccupancy>2</minOccupancy>
                                        <price>23.5</price>
                                        <stdOccupancy>2</stdOccupancy>
                                        <unitDescription>Executive Twin Room</unitDescription>
                                        <unitID>64</unitID>
                                    </roomUnits>
                                </roomUnits>
                        </hotels>

我正在尝试遍历每家酒店的酒店结果,并将每个结果转换为多维数组。我正在使用的代码不符合我的要求,如下所示:

$doc = new DOMDocument(); 


if ($doc->loadXML($result)) { 
$items = $doc->getElementsByTagName('hotels'); 
$hotelnames = array();

foreach($items as $item) { 
    $hotelname = array(); 
    $hotelimages = array();

    if($item->childNodes->length) { 
        foreach($item->childNodes as $i) {

            $hotelname[$i->nodeName] = $i->nodeValue; 

            if($i->childNodes->length){

                foreach($i->childNodes as $z) {

                    if($z->childNodes->length){

                        foreach($z->childNodes as $x) {

                            $hotelimage[$x->nodeName] = $x->nodeValue;

                        }

                    }



                }

            }

            $hotelimages[] = $hotelimage;
        } 
    } 

    $hotelnames[] = $hotelname; 
} 

}

我猜测我面临的问题主要是因为酒店和图像的子节点和父节点的名称相同。

非常感谢任何帮助或正确方向的点头。

3 个答案:

答案 0 :(得分:0)

我建议你使用xpath(例如在SimpleXML实现http://php.net/manual/en/simplexmlelement.xpath.php中)来加载你需要的值。

或者,如果您需要将整个XML解析为数组,则始终可以使用PEAR XML_Serializer包(http://pear.php.net/package/XML_Serializer)来反序列化XML。

答案 1 :(得分:0)

除了直接使用DOM,我建议你,除非你确实需要访问DOM,否则使用SimpleXML执行这些任务

它使得处理XML数据非常容易,你可以像普通数组一样对它采取行动。

实施例

<?php 
  $url = 'http://www.flickr.com/services/feeds/photos_public.gne';   

  foreach(simplexml_load_file($url)->entry as $entry) {
    echo $entry->content; 
  }
?>

该功能的几行:)

祝你好运!

答案 2 :(得分:0)

我正在研究XML,并注意到一些XML标记不正确 room {Ex: <images><images></images><images></images></images>就像roomunit一样。

我认为它应该像<images><image></image><image></image></images>这将有助于在php中迭代XML标记。