我有一个简单的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
按照此处的建议解析它:parse an XML with SimpleXML which has multiple namespaces和此处:Trouble Parsing SOAP response in PHP using simplexml,但我无法使其正常工作。
这是我的代码:
$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;
}
答案 0 :(得分:15)
$doc = new DOMDocument();
$doc->loadXML( $yourxmlresponse );
$LoginResults = $doc->getElementsByTagName( "LoginResult" );
$LoginResult = $LoginResults->item(0)->nodeValue;
var_export( $LoginResult );
答案 1 :(得分: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);
}