Использование xpath для объекта PHP SimpleXML, пространств имен SOAP + (не работает ..) - PullRequest
0 голосов
/ 05 октября 2010

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

Спасибо, Roman

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

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

$response->registerXPathNamespace("site", "http://webservices.site.com/definitions");
$_res = $response->xpath('//site:SessionId');

также, см. этот предыдущий вопрос переполнения стека

1 голос
/ 05 октября 2010

Вам необходимо зарегистрировать пространство имен по умолчанию, используемое также элементом <SessionId>. Поскольку <SessionId> находится в пространстве имен по умолчанию, у него нет префикса, но для того, чтобы ваш XPath работал, вам необходимо также связать это пространство имен с некоторым префиксом, а затем использовать этот префикс в выражении XPath.

$response->registerXPathNamespace("ns",
    "http://webservices.site.com/definitions");
$_res = $response->xpath('//soap:Header/ns:SessionId');

Выражения XPath (1.0) без префикса пространства имен всегда соответствуют только целям в пространстве без имен.

...