2013-04-09 11 views
9

używam cURL wysłać żądanie do usługi SOAP, wyślę w korpusie słupkowym XML zawierający parametry, w odpowiedzi otrzymuję:konwersji SOAP odpowiedzi XML do obiektu PHP lub tablicy

serwis internetowy: 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> 

Nie mam wystarczającego doświadczenia z danymi XML. Spędziłem wiele godzin próbując przekonwertować odpowiedź XML na obiekt PHP lub tablicę, ale bez powodzenia.

Muszę przeczytać wszystkie właściwości 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); 

Odpowiedz

9

Podpowiedź bksi nie jest taka zła, jednak pod względem technicznym, ponieważ jest to XML, potrzebujesz jedynie dostępu do elementów z przypisanymi nazwami. Działa to bardziej proste za pomocą wyrażenia XPath i rejestracji namspace-uri do własnego prefiksu:

$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); 

wyjściowa:

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" 

Jeśli nie chcesz używać XPath, trzeba określić przestrzeni nazw podczas przechodzenia, tylko dzieci w przestrzeni nazw samego elementu są dostępne bezpośrednio, jeśli sam element nie jest prefiksowany. Jako element główny jest poprzedzona trzeba najpierw przechodzić do odpowiedzi:

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

Następnie można skorzystać z zmiennej $response jak ty to wiesz:

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

ponieważ ten element nie jest poprzedzona . Ponieważ zwracany jest bardziej złożony wynik, prawdopodobnie jest najlepszy, ponieważ można łatwo uzyskać dostęp do wszystkich wartości odpowiedzi.

Twoje pytanie jest podobny do:

Może kod/opisy są pomocne, zbyt.

+0

Dzięki za odpowiedź, ustawienie przestrzeni nazw xPath zwraca błąd 500, być może błąd konfiguracji serwera. Drugie rozwiązanie działa świetnie. – Hamza

2

Hm. Do tego celu powinieneś użyć klienta SOAP, a nie tylko wysyłać żądania SOAP. PHP ma zintegrowane funkcjonalności SOAP http://php.net/manual/en/book.soap.php.

Istnieją niestandardowe biblioteki mydła, takie jak NuSOAP http://sourceforge.net/projects/nusoap/.

Większość frameworków php ma również biblioteki SOAP.

+0

Próbowałem z NuSOAP, ale pojawia się błąd mówiąc, że SoapAction brakuje nawet jeśli wyślę go w PHP nagłówek, a także metoda wywołania – Hamza

9

Można rozważyć przekazanie odpowiedzi SOAP za pomocą dokumentu DOM, a następnie przekonwertowanie go na obiekt 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; 
?> 

Może to jednak powodować problemy ze znakami specjalnymi w odpowiedzi, np. É i à. Inaczej działa.

0

Innym rozwiązaniem, jedynym rozwiązaniem, który pracował dla mnie:

$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 :)

Powiązane problemy