Intereting Posts

преобразование XML-ответа SOAP в объект или массив PHP

Я использую cURL для отправки запроса в службу SOAP, я отправляю в POST Body параметры, содержащие XML, в ответ я получаю:

Веб-сервис: 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> 

У меня недостаточно опыта работы с данными XML. Я потратил часы, пытаясь преобразовать ответ XML в объект или массив PHP, но без каких-либо успехов.

Мне нужно прочитать все PropertyResults.

Код PHP:

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

Подсказка bksi не так уж и неправильна, однако технически, поскольку это XML, вам нужно только правильно обращаться к элементам, расположенным по именам. Это упрощает работу с помощью выражения XPath и регистрации namspace-uri на ваш собственный префикс:

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

Вывод:

 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" 

Если вы не хотите использовать XPath, вам нужно указать пространство имен во время прохождения, только дети в пространстве имен самого элемента доступны напрямую, если сам элемент не префикс. Поскольку корневой элемент имеет префикс, вам сначала нужно перейти к ответу:

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

Тогда вы можете использовать переменную $response как вы ее знаете:

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

потому что этот элемент не префикс. По мере того, как возвращается более сложный результат, это, вероятно, лучше всего, потому что вы можете легко получить доступ ко всем значениям ответов.

Ваш вопрос похож на:

  • Разбор CDATA из SOAP-ответа с PHP

Возможно, код / ​​описания там тоже полезны.

Вы могли бы рассмотреть передачу ответа SOAP через документ DOM, а затем преобразовать его в объект 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; ?> 

Однако это может вызвать проблемы со специальными символами в вашем ответе, такие как é и à. Иначе это работает.

Гектометр Для этого вы должны использовать SOAP-клиент, а не просто отправлять запросы SOAP. PHP имеет интегрированные функции SOAP http://php.net/manual/en/book.soap.php .

Существуют пользовательские библиотеки мыла, такие как NuSOAP http://sourceforge.net/projects/nusoap/ .

В большинстве инфраструктур php также есть библиотеки SOAP.