这是我的SOAP XML文档:
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>
现在我需要访问SessionID元素的TextNode值。我用:
创建了一个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 :(得分:0)
好的,我发现了我做错了什么。
由于标签LoginResponse具有“xmlns”属性,因此我需要在客户端上使用前缀(我使用“x”)注册属性名称空间值。这样做是这样的:
$this->xpath = new \DOMXPath($this->dom);
$this->xpath->registerNamespace('x', "http://localhost/SPFService/");
,其中“http:// localhost / SPFService /”是LoginResponse标记的属性“xmlns”。然后我可以使用xpathQuery来查找,即“/ soap:Envelope / soap:Body / x:LoginResponse”。请注意,我将“LoginResponse”前缀为“x:”。