将 SOAP XML 响应转换为 PHP 对象或数组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15892639/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
converting SOAP XML response to a PHP object or array
提问by Hamza
I'm using cURL to send an request to a SOAP service, I send in POST Body the XML containing parameters, in response I receive:
我正在使用 cURL 向 SOAP 服务发送请求,我在 POST Body 中发送包含参数的 XML,作为响应我收到:
Web service: http://lcbtestxmlv2.ivector.co.uk/soap/book.asmx?WSDL
网络服务: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&date=10/05/2013&duration=15&room1=2,1,0_5&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&date=10/05/2013&duration=15&room1=2,1,0_5&regionid=9&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>
I don't have enough experience with XML data. I spent hours trying to convert the XML response to a PHP object or array, but without any success.
我对 XML 数据没有足够的经验。我花了几个小时试图将 XML 响应转换为 PHP 对象或数组,但没有成功。
I need to read all PropertyResults.
我需要阅读所有的 PropertyResults。
PHP Code:
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);
采纳答案by hakre
The hint of bksi is not that wrong, however technically as this is XML you only need to access the namespaced elements properly. This works more easy by using an XPath expression and registering the namspace-uri to your own prefix:
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);
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®ionid=9"
If you don't want to use XPath, you need to specify the namespace while you traverse, only the children in the namespace of the element itself are available directly if the element itself is not prefixed. As the root element is prefixed you first need to traverse up to the response:
如果不想使用XPath,则需要在遍历时指定命名空间,如果元素本身没有前缀,则只能直接使用元素本身命名空间中的子元素。由于根元素是前缀,您首先需要遍历响应:
$soap = simplexml_load_string($soapXMLResult);
$response = $soap->children('http://schemas.xmlsoap.org/soap/envelope/')
->Body->children()
->SearchResponse
;
Then you can make use of the $response
variable as you know it:
然后你可以使用$response
你所知道的变量:
$test = (string) $response->SearchResult->SearchURL;
because that element is not prefixed. As a more complex result is returned this is probably the best because you can easily access all the response values.
因为该元素没有前缀。当返回更复杂的结果时,这可能是最好的,因为您可以轻松访问所有响应值。
Your question is similar to:
你的问题类似于:
Maybe the code/descriptions there are helpful, too.
也许那里的代码/描述也有帮助。
回答by shasi kanth
You could consider passing the SOAP response through a DOM Document, and then converting it into a simplexml object.
您可以考虑通过 DOM 文档传递 SOAP 响应,然后将其转换为 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;
?>
However, this may cause problems with special characters in your response, like é and à. Else, it works.
但是,这可能会导致响应中出现特殊字符问题,例如 é 和 à。否则,它的工作原理。
回答by Jerry
Another solution, the only solution that worked for me :
另一个解决方案,唯一对我有用的解决方案:
$xml = $soap_xml_result;
$xml = preg_replace("/(<\/?)(\w+):([^>]*>)/", '', $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 :)
享受 :)
回答by bksi
Hm. You should use SOAP client to do that, not just send SOAP requests. PHP has integrated SOAP functionalities http://php.net/manual/en/book.soap.php.
嗯。您应该使用 SOAP 客户端来做到这一点,而不仅仅是发送 SOAP 请求。PHP 集成了 SOAP 功能 http://php.net/manual/en/book.soap.php。
There are custom soap libraries like NuSOAP http://sourceforge.net/projects/nusoap/.
有像 NuSOAP http://sourceforge.net/projects/nusoap/这样的自定义肥皂库 。
Most of php frameworks has SOAP libraries too.
大多数 php 框架也有 SOAP 库。