4

可能重复:
如何在没有 SoapClient 的情况下解析 SOAP 响应

我有一个简单的 nuSoap XML 响应:

<?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>
        <LoginResult xmlns="http://Siddin.ServiceContracts/2006/09">FE99E5267950B241F96C96DC492ACAC542F67A55</LoginResult>
    </soap:Body>
</soap:Envelope>

现在我正在尝试按照此处的simplexml_load_string建议对其进行解析:使用具有多个名称空间的 SimpleXML 解析 XML和此处:使用 simplexml 在 PHP 中解析 SOAP 响应时遇到问题,但我无法使其正常工作。

这是我的代码:

$xml = simplexml_load_string( $this->getFullResponse() );
$xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
$xml->registerXPathNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$xml->registerXPathNamespace('xsd', 'http://www.w3.org/2001/XMLSchema');

foreach($xml->xpath('//soap:Body') as $header) {
    var_export($header->xpath('//LoginResult')); 
}

但我仍然只得到这个结果:

/* array ( )

我究竟做错了什么?或者我想了解什么简单的事情?


MySqlError使用 DOM 的工作最终结果:

$doc = new DOMDocument();
$doc->loadXML( $response  );
echo $doc->getElementsByTagName( "LoginResult" )->item(0)->nodeValue;

ndm使用 SimpleXML 的工作最终结果:

$xml = simplexml_load_string( $response );
foreach($xml->xpath('//soap:Body') as $header) {
    echo (string)$header->LoginResult;
}
4

2 回答 2

15
$doc = new DOMDocument();
$doc->loadXML( $yourxmlresponse );

$LoginResults = $doc->getElementsByTagName( "LoginResult" );
$LoginResult = $LoginResults->item(0)->nodeValue;

var_export( $LoginResult );
于 2012-10-19T08:00:22.393 回答
5

这里出了什么问题,SimpleXMLs 默认命名空间支持很差。为了使用 XPath 表达式获取该节点,您需要为默认命名空间注册一个前缀并在查询中使用它,即使该元素没有前缀,例如:

foreach($xml->xpath('//soap:Body') as $header) {
    $header->registerXPathNamespace('default', 'http://Siddin.ServiceContracts/2006/09');
    var_export($header->xpath('//default:LoginResult'));
}

但是,实际上不需要使用 XPath 来访问这个节点,您可以直接访问它:

foreach($xml->xpath('//soap:Body') as $header) {
    var_export($header->LoginResult);
}
于 2012-10-19T08:05:20.847 回答