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ここで提案されているようにそれを解析しようとしています: parse an XML with SimpleXML which has multiple namespacesとここ: Trouble Parsing SOAP response in PHP using simplexml , but I can't get it working.

これは私のコードです:

$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

ここで問題になっているのは、SimpleXMLのデフォルトの名前空間サポートが不十分なことです。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 に答える