2013-04-09 27 views
9

Tôi đang sử dụng cURL để gửi một yêu cầu đến một dịch vụ SOAP, tôi gửi trong POST Body XML chứa các thông số, để đáp ứng tôi nhận được:chuyển đổi XML response SOAP đến một đối tượng PHP hoặc mảng

dịch vụ Web: http://lcbtestxmlv2.ivector.co.uk/soap/book.asmx?WSDL

<?xml version="1.0" encoding="UTF-8"?> 
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <soap:Body> 
      <SearchResponse xmlns="http://ivectorbookingxml/"> 
      <SearchResult> 
       <ReturnStatus> 
        <Success>true</Success> 
        <Exception /> 
       </ReturnStatus> 
       <SearchURL>http://www.lowcostholidays.fr/dl.aspx?p=0,8,5,0&amp;date=10/05/2013&amp;duration=15&amp;room1=2,1,0_5&amp;regionid=9</SearchURL> 
       <PropertyResults> 
        <PropertyResult> 
         <TotalProperties>215</TotalProperties> 
         <PropertyID>1795</PropertyID> 
         <PropertyName>Hotel Gaddis</PropertyName> 
         <Rating>3.0</Rating> 
         <Country>Egypte</Country> 
         <Resort>Louxor</Resort> 
         <Strapline>Cet établissement confortable propose un très bon service à un bon rapport qualité-prix. Cet hôtel de 6 étages compte 55 chambres et comprend une terrasse, une réception avec coffre-fort et ascenseur,</Strapline> 
         <Description>Cet établissement confortable propose un très bon service à un bon rapport qualité-prix. Cet hôtel de 6 étages compte 55 chambres et comprend une terrasse, une réception avec coffre-fort et ascenseur,...</Description> 
         <CMSBaseURL>http://lcbtestxml1.ivector.co.uk/content/DataObjects/Property/Image/</CMSBaseURL> 
         <MainImage>image_1795_v1.jpg</MainImage> 
         <MainImageThumbnail>imagethumb_1795_v1.jpg</MainImageThumbnail> 
         <SearchURL>http://www.lowcostholidays.fr/dl.aspx?p=0,8,5,0&amp;date=10/05/2013&amp;duration=15&amp;room1=2,1,0_5&amp;regionid=9&amp;propertyid=1795</SearchURL> 
         <RoomTypes> 
         <RoomType> 
          <Seq>1</Seq> 
          <PropertyRoomTypeID>690039000</PropertyRoomTypeID> 
          <MealBasisID>3</MealBasisID> 
          <RoomType>Twin/double Room</RoomType> 
          <RoomView /> 
          <MealBasis>Petit Déjeuner</MealBasis> 
          <NonRefundableRates>false</NonRefundableRates> 
          <SubTotal>150.58</SubTotal> 
          <Discount>0</Discount> 
          <Total>150.58</Total> 
          <Adults>2</Adults> 
          <Children>1</Children> 
          <Infants>0</Infants> 
          <Errata /> 
         </RoomType> 
         <RoomType> 
          <Seq>1</Seq> 
          <PropertyRoomTypeID>690039001</PropertyRoomTypeID> 
          <MealBasisID>7</MealBasisID> 
          <RoomType>Twin/double Room</RoomType> 
          <RoomView /> 
          <MealBasis>Demi-Pension</MealBasis> 
          <NonRefundableRates>false</NonRefundableRates> 
          <SubTotal>291.64</SubTotal> 
          <Discount>0</Discount> 
          <Total>291.64</Total> 
          <Adults>2</Adults> 
          <Children>1</Children> 
          <Infants>0</Infants> 
          <Errata /> 
         </RoomType> 
         <RoomType> 
          <Seq>1</Seq> 
          <PropertyRoomTypeID>690039002</PropertyRoomTypeID> 
          <MealBasisID>5</MealBasisID> 
          <RoomType>Double/twin Room</RoomType> 
          <RoomView /> 
          <MealBasis>Pension Complète</MealBasis> 
          <NonRefundableRates>false</NonRefundableRates> 
          <SubTotal>529.22</SubTotal> 
          <Discount>0</Discount> 
          <Total>529.22</Total> 
          <Adults>2</Adults> 
          <Children>1</Children> 
          <Infants>0</Infants> 
          <Errata /> 
         </RoomType> 
         </RoomTypes> 
        </PropertyResult> 
       </PropertyResults> 
      </SearchResult> 
      </SearchResponse> 
     </soap:Body> 
    </soap:Envelope> 

Tôi không có đủ kinh nghiệm với dữ liệu XML. Tôi đã dành hàng giờ cố gắng chuyển đổi phản hồi XML thành một đối tượng hoặc mảng PHP, nhưng không thành công.

Tôi cần đọc tất cả PropertyResults.

PHP Code:

$xml = simplexml_load_string($soap_xml_result); 

$xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/'); 
$xml->registerXPathNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance'); 
$xml->registerXPathNamespace('xsd', 'http://www.w3.org/2001/XMLSchema'); 

$test = (string) $xml->Body->SearchResponse->SearchResult->SearchURL; 
var_export($test); 

Trả lời

9

Gợi ý của bksi không phải là sai, tuy nhiên về mặt kỹ thuật vì đây là XML, bạn chỉ cần truy cập các phần tử không gian tên đúng cách. Này hoạt động dễ dàng hơn bằng cách sử dụng một biểu thức XPath và đăng ký namspace-uri để prefix của riêng bạn:

$soap = simplexml_load_string($soapXMLResult); 
$soap->registerXPathNamespace('ns1', 'http://ivectorbookingxml/'); 
$test = (string) $soap->xpath('//ns1:SearchResponse/ns1:SearchResult/ns1:SearchURL[1]')[0]; 
var_dump($test); 

Output:

string(100) "http://www.lowcostholidays.fr/dl.aspx?p=0,8,5,0&date=10/05/2013&duration=15&room1=2,1,0_5&regionid=9" 

Nếu bạn không muốn sử dụng XPath, bạn cần phải xác định không gian tên trong khi bạn đi qua, chỉ có trẻ em trong không gian tên của chính phần tử có sẵn trực tiếp nếu bản thân phần tử không có tiền tố. Như phần tử gốc là tiền tố trước tiên bạn cần phải đi qua cho đến phản ứng:

$soap  = simplexml_load_string($soapXMLResult); 
$response = $soap->children('http://schemas.xmlsoap.org/soap/envelope/') 
        ->Body->children() 
         ->SearchResponse 
; 

Sau đó, bạn có thể tận dụng các biến $response như bạn biết điều đó:

$test = (string) $response->SearchResult->SearchURL; 

vì yếu tố đó không tiền tố . Như một kết quả phức tạp hơn được trả về, điều này có lẽ là tốt nhất bởi vì bạn có thể dễ dàng truy cập tất cả các giá trị phản hồi.

Câu hỏi của bạn là tương tự như:

Có lẽ mã/giới thiệu có hữu ích, quá.

+0

Cảm ơn câu trả lời của bạn, thiết lập không gian tên xPath trả về lỗi 500, có thể cấu hình sai máy chủ. Giải pháp thứ hai hoạt động tốt. – Hamza

2

Hm. Bạn nên sử dụng máy khách SOAP để làm điều đó, không chỉ gửi các yêu cầu SOAP. PHP đã tích hợp chức năng SOAP http://php.net/manual/en/book.soap.php.

Có các thư viện xà phòng tùy chỉnh như NuSOAP http://sourceforge.net/projects/nusoap/.

Hầu hết các khuôn khổ php đều có thư viện SOAP.

+0

Tôi đã thử với nuSOAP, nhưng tôi nhận được một thông báo lỗi rằng SOAPAction là mất tích ngay cả khi tôi gửi nó trong PHP tiêu đề, và cũng thông qua phương thức gọi – Hamza

9

Bạn có thể xem xét chuyển đáp ứng SOAP thông qua Tài liệu DOM và sau đó chuyển đổi nó thành đối tượng simplexml.

<?php 
$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($soap_response); 
libxml_clear_errors(); 
$xml = $doc->saveXML($doc->documentElement); 
$xml = simplexml_load_string($xml); 
$response = $xml->body->envelope->body->searchresponse; 
//print_r($response); exit; 
echo $response->searchresult->returnstatus->success; 
echo '<br>'; 
echo $response->searchresult->searchurl; 
?> 

Tuy nhiên, điều này có thể gây ra vấn đề với các ký tự đặc biệt trong phản hồi của bạn, như é và à. Khác, nó hoạt động.

0

Một giải pháp, giải pháp duy nhất làm việc cho tôi:

$xml = $soap_xml_result; 
$xml = preg_replace("/(<\/?)(\w+):([^>]*>)/", '$1$2$3', $xml); 
$xml = simplexml_load_string($xml); 
$json = json_encode($xml); 
$responseArray = json_decode($json, true); // true to have an array, false for an object 
print_r($responseArray); 

Enjoy :)