1

次の XML があります (SOAP リクエストと言えます)。

<SOAPENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS="http://xyz.gov/headerschema" >
    <SOAPENV:Header>
        <NS:myHeader>
            <NS:SourceID>223423</NS:SourceID>
        </NS:myHeader>
    </SOAPENV:Header>
</SOAPENV:Envelope>

次のコードを使用していますが、正常に動作します。

<?php 
$myRequest ='<SOAPENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS="http://xyz.gov/headerschema" >
   <SOAPENV:Header>
      <NS:myHeader>
         <NS:SourceID>223423</NS:SourceID>
      </NS:myHeader>
   </SOAPENV:Header>
   </SOAPENV:Envelope>';
$xml = simplexml_load_string($myRequest, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/");
$namespaces = $xml->getNameSpaces(true);

$soapHeader = $xml->children($namespaces['SOAPENV'])->Header;
$myHeader = $soapHeader->children($namespaces['NS'])->myHeader;
echo (string)$myHeader->SourceID;
?>

問題

プレフィックス ( SOAPENV + NS ) は知っていますが、クライアントはプレフィックスを好きなように変更できるため、( MY-SOAPENV + MY-NS) プレフィックスを持つ xml ドキュメントを送信する可能性があります。

私の質問

名前空間プレフィックスは静的ではないため、これをどのように処理できますか?どうすれば解析できますか?

ありがとう

4

2 に答える 2

3

使用する必要がありますDOM-個人的には、「単純なXML」は矛盾しているため、これは一般的なケースに当てはまると思いますが、他の人が同意しないことは知っています。SOAP のような複雑なドキュメント ツリーを扱う場合、これは確かに当てはまります。

DOM が提供するgetElementsByTagNameNS()(およびその他の関連する NS ターゲティング メソッド) を使用すると、名前空間URI (つまり、静的なままにして事前に知っておくべきもの) を、プレフィックスについて具体的に指定する代わりに指定できます。

$soapNsUri = 'http://schemas.xmlsoap.org/soap/envelope/';
$myNsUri = 'http://xyz.gov/headerschema';

$doc = new DOMDocument;
$doc->loadXML($myRequest);

$header = $doc->getElementsByTagNameNS($soapNsUri, 'Header')->item(0);
$myHeader = $header->getElementsByTagNameNS($myNsUri, 'myHeader')->item(0);
$sourceID = $myHeader->getElementsByTagNameNS($myNsUri, 'SourceID')->item(0);

echo $sourceID->firstChild->data;

動いているのを見る

于 2013-06-26T10:18:45.947 に答える