После изучения этого на SO и google в течение нескольких часов … Я надеюсь получить помощь здесь: (Я всего в одном шаге от запуска регулярного выражения, чтобы полностью удалить пространства имен)
Сначала это XML:
<?xml version="1.0" encoding="utf-16"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header xmlns="http://webservices.site.com/definitions"> <SessionId>0119A|1</SessionId> </soap:Header> <soap:Body> <Security_AuthenticateReply xmlns="http://xml.site.com/QQ"> <processStatus> <statusCode>P</statusCode> </processStatus> </Security_AuthenticateReply> </soap:Body> </soap:Envelope>
Теперь это то, что выглядит мой код в PHP:
$response = simplexml_load_string( $str ,NULL, false, "http://schemas.xmlsoap.org/soap/envelope/" ); // just making sure the name space is "registered" // but I tested all examples also with this removed $response->registerXPathNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/"); $_res = $response->xpath('//soap:Header'); print_r($_res); /*** result: simple query for the root "soap" namespace, this looks good! (so far..) Array ( [0] => SimpleXMLElement Object ( [SessionId] => 0119A|1 ) ) ***/ // now we query for the "SessionId" element in the XML $_res = $response->xpath('//soap:Header/SessionId'); print_r($_res); /*** result: this does not return anything! Array ( ) ***/ // another approach $_res = $response->xpath('//soap:Header/SessionId/text()'); print_r($_res); /*** result: this does not return anything at all! ***/ // Finally, without using XPath this does work $_res = $response->xpath('//soap:Header'); $_res = (string)$_res[0]->SessionId; echo $_res; /*** result: this worked 0119A|1 ***/
Как я могу получить сообщение SOAP, работающее с XPATH ???
Благодарю, Роман
Несколько пространств имен возились с ним, добавив для меня следующие работы
$response->registerXPathNamespace("site", "http://webservices.site.com/definitions"); $_res = $response->xpath('//site:SessionId');
также, см. предыдущий вопрос о переполнении стека
Вам необходимо зарегистрировать пространство имен по умолчанию, используемое элементом <SessionId>
. Поскольку <SessionId>
находится в пространстве имен по умолчанию, у него нет префикса, но для того, чтобы ваш XPath работал, вам необходимо связать это пространство имен с некоторым префиксом, а затем использовать этот префикс в выражении XPath.
$response->registerXPathNamespace("ns", "http://webservices.site.com/definitions"); $_res = $response->xpath('//soap:Header/ns:SessionId');
Выражения XPath (1.0) без префикса пространства имен всегда соответствуют только целям в пространстве имен.