Использование xpath в объекте PHP SimpleXML, пространства имен SOAP + (не работает ..)

После изучения этого на 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 ???

Благодарю, Роман

Solutions Collecting From Web of "Использование xpath в объекте PHP SimpleXML, пространства имен SOAP + (не работает ..)"

Несколько пространств имен возились с ним, добавив для меня следующие работы

 $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) без префикса пространства имен всегда соответствуют только целям в пространстве имен.