2011-07-07 137 views
0

我一直在用我的頭髮撕掉幾個小時,並認爲我會在這裏發佈它,看看有沒有人有任何建議。XML/PHP到陣列問題

基本上我receving通過SOAP一些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; 
} 

} 

我猜我面對的多是由事實子和父節點命名爲造成問題酒店和圖像也是如此。

任何幫助或在正確的方向點頭將不勝感激。

回答

0

我建議你使用xpath(例如在SimpleXML實現http://php.net/manual/en/simplexmlelement.xpath.php)加載你需要的值。

或者,如果您需要將整個XML解析爲數組,則始終可以使用PEAR XML_Serializer包(http://pear.php.net/package/XML_Serializer)來反序列化您的XML。

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; 
    } 
?> 

比較少的線來實現該功能:)

祝你好運!

+0

感謝您的答覆, 因此理論上這應該工作,但由於某種原因,它不: 的foreach(simplexml_load_string($結果) - >酒店爲$進入){ 回聲$入門>酒店; } – mikestrand

+0

您的酒店標籤不位於根。您將它包含在多個其他必須首先訪問的節點中。您可以按照上述相同的方式執行此操作,但可以使用多個步驟'$ xml-> node1-> node1Child1-> data',或者您可以使用'children()'函數提取'hotels'標記。還有'xpath()'函數可以讓你在xml上執行xpath搜索。如果你熟悉xpath,這很可能是最優雅的解決方案。 – inquam

0

我正在查找XML,我注意到一些XML標記不正確 Ex: <images><images></images><images></images></images>與roomunit的情況相同。

我認爲它應該像<images><image></image><image></image></images>這將有助於遍歷PHP中的XML標記。