Im в процессе подключения к SOAP api, передачи некоторых данных, а затем чтения ответа. Im до того момента, когда я получаю запрос 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);
но он возвращает пустой объект simplexml.
simplexml_load_string возвращает объект класса 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);
$result
, потому что SoapClient уже позаботился о том, чтобы разобрать XML для вас, в SOAP XML используется для транспорта.