2012-03-12 3 views
0

Это мой SOAP XML документа:Попытка запроса мыла: элементы тела с использованием XPath

HTTP/1.1 200 OK 
Date: Mon, 12 Mar 2012 15:42:41 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private, max-age=0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 424 

<?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:Body> 
     <LoginResponse xmlns="http://localhost/SPFService/"> 
     <LoginResult> 
      <Reply xmlns=""> 
      <SessionID>cdfbe607-59b1-4912-ae54-2190f1b7c7dd 
      </SessionID> 
      </Reply> 
     </LoginResult> 
     </LoginResponse> 
    </soap:Body> 
    </soap:Envelope> 

Теперь мне нужно получить доступ к значению TextNode элемента SessionID. Я создал xpath, используя:

$this->dom->loadXML($response); 
$this->xpath = new \DOMXPath($this->dom); 

, где $ response - строка, содержащая указанный выше xml.

Проблема в том, что я могу запросить только "/soap:Envelope" и "/soap:Envelope/soap:Body". Если я попытаюсь запросить "/soap:Envelope/soap:Body/LoginResponse", я получаю пустой DOMNodeList. Как мне отладить этот беспорядок?

ответ

0

Хорошо, я узнал, что я делаю неправильно.

Поскольку тег LoginResponse имеет атрибут «xmlns», мне нужно зарегистрировать значение пространства имен атрибута с префиксом (я использовал «x») на клиенте. Это делается так:

$this->xpath = new \DOMXPath($this->dom); 
$this->xpath->registerNamespace('x', "http://localhost/SPFService/"); 

, где "HTTP: // локальный/SPFService /" является атрибут "XMLNS" значение для LoginResponse тега. Затем я могу использовать xpathQuery для поиска, т. Е., "/ Soap: Envelope/soap: Body/x: LoginResponse". Обратите внимание, что я префикс «LoginResponse» с «x:».

Смежные вопросы