2016-07-22 217 views
0

我是新來的PHP和工作,我必須處理XML API。我正在使用laravel 5.2框架來創建該項目。laravel從XML API響應獲取數據

我有一個這樣的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<HotelListing> 
    <HotelCode Currency="INR">1000000681</HotelCode> 
    <RoomList> 
     <Room> 
      <RoomTypeName>Deluxe Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001713</RoomTypeCode> 
      <IsActive>True</IsActive> 
     </Room> 
     <Room> 
      <RoomTypeName>Den Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001714</RoomTypeCode> 
      <IsActive>True</IsActive> 
     </Room> 
     <Room> 
      <RoomTypeName>Premium Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001715</RoomTypeCode> 
      <IsActive>True</IsActive> 
     </Room> 
     <Room> 
      <RoomTypeName>Couple Package Deluxe Non AC</RoomTypeName> 
      <RoomTypeCode>45000012484</RoomTypeCode> 
      <IsActive>False</IsActive> 
     </Room> 
     <Room> 
      <RoomTypeName>Couple Package for Den AC Room</RoomTypeName> 
      <RoomTypeCode>45000012503</RoomTypeCode> 
      <IsActive>False</IsActive> 
     </Room> 
     <Room> 
      <RoomTypeName>Couple Package for PREMIUM AC </RoomTypeName> 
      <RoomTypeCode>45000012507</RoomTypeCode> 
      <IsActive>False</IsActive> 
     </Room> 
    </RoomList> 
    <RatePlanList> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Deluxe Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001713</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000001857</RatePlanCode> 
      <RatePlanName>APAI</RatePlanName> 
      <MealPlan>FREE Breakfast, Lunch and Dinner</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Deluxe Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001713</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000012282</RatePlanCode> 
      <RatePlanName>CPAI</RatePlanName> 
      <MealPlan>FREE Breakfast</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Deluxe Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001713</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000044053</RatePlanCode> 
      <RatePlanName>MAPAI</RatePlanName> 
      <MealPlan>FREE Breakfast and Dinner</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Den Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001714</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000001858</RatePlanCode> 
      <RatePlanName>APAI</RatePlanName> 
      <MealPlan>FREE Breakfast, Lunch and Dinner</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Den Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001714</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000012283</RatePlanCode> 
      <RatePlanName>CPAI</RatePlanName> 
      <MealPlan>FREE Breakfast</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Den Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001714</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000044054</RatePlanCode> 
      <RatePlanName>MAPAI</RatePlanName> 
      <MealPlan>FREE Breakfast and Dinner</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Premium Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001715</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000001859</RatePlanCode> 
      <RatePlanName>APAI</RatePlanName> 
      <MealPlan>FREE Breakfast, Lunch and Dinner</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Premium Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001715</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000012284</RatePlanCode> 
      <RatePlanName>CPAI</RatePlanName> 
      <MealPlan>FREE Breakfast</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
     <RatePlan IsEditable="True"> 
      <RoomTypeName>Premium Cottage AC</RoomTypeName> 
      <RoomTypeCode>45000001715</RoomTypeCode> 
      <IsActive>True</IsActive> 
      <RatePlanCode>990000044055</RatePlanCode> 
      <RatePlanName>MAPAI </RatePlanName> 
      <MealPlan>FREE Breakfast and Dinner</MealPlan> 
      <LinkedRatePlan IsLinked="False"/> 
     </RatePlan> 
    </RatePlanList> 
</HotelListing> 

,現在我想從中獲取房間的數據和我的代碼就是$迴應是XML字符串:

private function hotelDetailsResponse($response) 
    { 
     $data = []; 

     $dom = new \DOMDocument(); 
     $dom->formatOutput = TRUE; 
     $dom->preserveWhiteSpace = FALSE; 
     $dom->loadXml($response); 

     $Rooms = $dom->getElementsByTagName("Room"); 
     foreach($Rooms as $Room) { 

      $names = $Room->getElementsByTagName("RoomTypeName"); 
      $data[] = $names->item(0)->nodeValue; 
      $types = $Room->getElementsByTagName("RoomTypeCode"); 
      $data[] = $types->item(0)->nodeValue; 

      } 

      return $data; 
    } 

它給了我陣列像這樣:

["Deluxe Cottage AC","45000001713","Den Cottage AC","45000001714","Premium Cottage AC","45000001715","Couple Package Deluxe Non AC","45000012484","Couple Package for Den AC Room","45000012503","Couple Package for PREMIUM AC ","45000012507"] 

其中如我需要這樣的陣列:

[{"Name":"Couple Package for PREMIUM AC ","Code":"45000012507"}, {"Name":"Couple Package for PREMIUM AC ","Code":"45000012507"}, {"Name":"Couple Package for PREMIUM AC ","Code":"45000012507"}] 

我也想給這樣的foreach中的價值:

$Rooms = $dom->getElementsByTagName("Room"); 
foreach($Rooms as $Room) { 

    $names = $Room->getElementsByTagName("RoomTypeName"); 
    $data['name'] = $names->item(0)->nodeValue; 
    $types = $Room->getElementsByTagName("RoomTypeCode"); 
    $data['code'] = $types->item(0)->nodeValue; 

    } 

但其只給我像下面最後一個參數:

{"name":"Couple Package for PREMIUM AC ","code":"45000012507"} 

好心幫....

+0

你能減少你的問題更succint例子嗎?關於如何做出重大問題的一個很好的方法包括製作一個[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve)。對於其他遇到類似問題的用戶來說更好,並且更容易回答。 – ssice

回答

0

您正在考慮名稱和類型,並將它們放入同一個陣列中:

$names = $Room->getElementsByTagName("RoomTypeName"); 
$data[] = $names->item(0)->nodeValue; 
$types = $Room->getElementsByTagName("RoomTypeCode"); 
$data[] = $types->item(0)->nodeValue; 

降低,看起來像這樣:

$data[] = $name; 
$data[] = $type; 

你需要做什麼,而不是將這些添加爲關聯數組$data陣列。這裏有一個聲明的方式來做到這一點:

$data[] = [ 
    'Name' => $names->item(0)->nodeValue, 
    'Code' => $types->item(0)->nodeValue 
]; 

這是在行動:https://eval.in/610157

+0

感謝它工作... –