所有
尝试解析此SOAP响应,但xpath()正在返回
调试警告:SimpleXMLElement :: xpath()未定义的名称空间前缀 调试警告:SimpleXMLElement :: xpath()评估失败
$result = '<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<env:Body xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<v4:TrackReply xmlns:v4="http://fedex.com/ws/track/v4">
...
</v4:TrackReply>
</env:Body>
</soapenv:Envelope>';
$xml = simplexml_load_string($result,NULL,NULL,'http://schemas.xmlsoap.org/soap/envelope/');
foreach($xml->xpath('env:Body') as $body){
//drill down here...
}
答案 0 :(得分:2)
尝试将命名空间注册到'env'
$xml->registerXPathNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/');
修改强>
此代码在body
$bodies = $xml->xpath('env:Body');
foreach($bodies as $body){
$reply = $body->children('v4', TRUE)->TrackReply;
var_dump($reply);
}
或者,您可以直接使用以下内容获取TrackReply
等元素:
$xml->registerXPathNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/');
$xml->registerXPathNamespace('v4', 'http://fedex.com/ws/track/v4');
var_dump($xml->xpath('env:Body/v4:TrackReply'));
答案 1 :(得分:-1)
SimpleXML忽略XML结构的env:
部分,而是返回如下构造的对象:
SimpleXMLElement Object
(
[Header] => SimpleXMLElement Object
(
)
[Body] => SimpleXMLElement Object
(
)
)
您可以使用以下XPath查询访问正文:$xml->xpath('Body')
或只使用以下语法访问该子代:$xml->Body
。