SimpleXML解析问题

时间:2011-06-23 15:21:42

标签: 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/">
    <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...
}

2 个答案:

答案 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