0

名前空間とリクエスト名がわかれば、XML SOAP を解析できます。

さまざまな種類の SOAP リクエストがあるため、SOAP ファイルでリクエスト名を取得したいと考えています。私の SOAP の一部の抜粋:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:ns1="http://schema.example.com" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
>
<SOAP-ENV:Body>
 **<ns1:SendMailling>**
 <campagne xsi:type="ns1:Campaign"><ActivateDedup xsi:nil="true"/><BillingCode     xsi:nil="true"/><DeliveryFax xsi:type="ns1:DeliveryFax"/>
 <DeliveryMail xsi:type="ns1:DeliveryMail">
 ...

PHP コード:

if(is_file($file))
    {
        $content=file_get_contents($file);


        $xml = simplexml_load_string($content);
        $xml->registerXPathNamespace('ns1', 'http://schema.example.com');



        foreach ($xml->xpath('\\SOAP-ENV:') as $item)
        {
            //certainly the bad way?
            echo "<pre>";
                print_r($item);
            echo "</pre>";

        }

        echo "<pre>";
            print_r($xml);
        echo "</pre>";


    }

結果が得られません...表示させたい: 'SendMailling' (リクエスト名を特定)

具体的に指定すると

//foreach($xml->xpath('//ns1:SendMailling') as $item)

問題はありません。

やってみ foreach($xml->xpath('//ns1') as $item)
$xml->xpath('//SOAP-ENC'), $xml->xpath('//Body')けど…

4

1 に答える 1

0

あなたの質問を理解するのに問題があったので、これはおそらく答えではありません.

私があなたの言うことを正しく理解していれば、/ の直接の子ノードであり<SOAP-ENV:Body>ns1/http://schema.example.com名前空間にあるすべての要素ノードを選択する必要があります。

で使用するネームスペース プレフィックスはすでに登録されていますSimpleXMLElement::xpath

$xml->registerXPathNamespace('ns1', 'http://schema.example.com');

私が見る限り、あなたはまだSOAP-ENV/ 名前空間を登録していません。http://schemas.xmlsoap.org/soap/envelope/

要素に一致する XPath では、その名前空間を指定できます。これを行う方法は複数あります。

*               All elements in any namespace.
prefix:*        All elements in namespace "prefix" (registered prefix)
prefix:local    Only "local" elements in namespace "prefix"

たとえば、ns1プレフィックスを持つすべての要素を選択するには:

//ns1:*

直接の子のみが必要なため、これを制限したい場合がある<SOAP-ENV:Body> ため、その名前空間をSOAP-ENVプレフィックスで登録し、以前の xpath を拡張します。

/SOAP-ENV:Body/ns1:*

これには、探しているすべての要素が含まれているはずです。


(OP:) ありがとうございます。

foreach ($xml->xpath('//SOAP-ENV:Body/ns1:*') as $item) {
    echo $item->getName() . "<br>";
}

すべて問題ありません。リクエスト Name を取得し'SendMailling'ます。

于 2012-06-28T10:51:31.903 に答える