正在解析 XML SOAP 响应

Parsing XML SOAP response

我正在连接到 SOAP api,传递一些数据然后读取响应。我到了我收到要发送的 SOAP 请求并收到响应的地步,但我似乎无法弄清楚如何解析返回的 XML.

首先我传递凭据以接收 auth_ticket:

$rap_soapUrl = "https://technet.rapaport.com/webservices/prices/rapaportprices.asmx?wsdl";
$client = new \SoapClient($rap_soapUrl, array('trace' => 1));
$result = $client->Login($rap_credentials);
$response = $client->__getLastResponse();

这就是我卡住的地方。如果我回显 $response 我得到

<?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:Header><AuthenticationTicketHeader xmlns="http://technet.rapaport.com/"><Ticket>TICKETHASH</Ticket></AuthenticationTicketHeader></soap:Header><soap:Body><LoginResponse xmlns="http://technet.rapaport.com/" /></soap:Body></soap:Envelope>

我需要解析出来的是TICKETHASH,然后在下一个请求中使用。

我可以手动解析字符串,搜索 <Ticket></Ticket> 之间的任何内容,但感觉很笨拙,不是正确的处理方式。

我尝试使用 $xml = simplexml_load_string($response); 但它 returns 是一个空的 simplexml 对象。

simplexml_load_string returns an object of class SimpleXMLElement 然后你可以使用它遍历 XML 来解析你想要的标签。

由于 <Ticket> 位于 http://technet.rapaport.com/ 命名空间中,这变得稍微困难​​一些。 但是您可以使用以下内容:

$xml = simplexml_load_string($str);
$xml->registerXPathNamespace('technet', 'http://technet.rapaport.com/');
$ticket = $xml->xpath('//technet:Ticket');
$ticket_hash = (string)$ticket[0];

print_r($ticket_hash);