2011-07-07 68 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标记。