Php SimpleXML解析问题
全部, 正在尝试分析此SOAP响应,但xpath()正在返回 调试警告:SimpleXMLElement::xpath()未定义命名空间前缀 调试警告:SimpleXMLElement::xpath()计算失败Php SimpleXML解析问题,php,soap,xpath,Php,Soap,Xpath,全部, 正在尝试分析此SOAP响应,但xpath()正在返回 调试警告:SimpleXMLElement::xpath()未定义命名空间前缀 调试警告:SimpleXMLElement::xpath()计算失败 $result = '<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
$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...
}
$result=
...
';
$xml=simplexml\u load\u字符串($result,NULL,NULL,'http://schemas.xmlsoap.org/soap/envelope/');
foreach($xml->xpath('env:Body')作为$Body){
//在这里钻研。。。
}
SimpleXML忽略XML结构的env:
部分,而是返回如下构造的对象:
SimpleXMLElement Object
(
[Header] => SimpleXMLElement Object
(
)
[Body] => SimpleXMLElement Object
(
)
)
您可以通过以下XPath查询访问主体:
$xml->XPath('body')
,或者只使用以下语法访问子对象:$xml->body
SimpleXML忽略xml结构的env:
部分,而是返回如下构造的对象:
SimpleXMLElement Object
(
[Header] => SimpleXMLElement Object
(
)
[Body] => SimpleXMLElement Object
(
)
)
您可以通过以下XPath查询访问主体:
$xml->XPath('body')
,或者只使用以下语法访问子对象:$xml->body
尝试将命名空间注册到“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'));
尝试将命名空间注册到“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'));
通过调用registerXPathNamespace(),我能够进入我的foreach循环,因为$xml->xpath('env:Body')现在创建了一个空的simplexmlementobject@Slinky请参阅更新的答案-SimpleXMLElement对象看起来确实是空的,但实际上包含我看到的信息。这很有帮助。感谢调用registerXPathNamespace()我能够进入我的foreach循环,因为$xml->xpath('env:Body')现在创建了一个空的simplexmlementobject@Slinky请参阅更新的答案-SimpleXMLElement对象看起来确实是空的,但实际上包含我看到的信息。这很有帮助。谢谢