3

XML の例があり、PHP を使用して適切にエンコードしようとしているかなり複雑なパラメーター文字列を渡そうとしています。私が与えられたリクエストの例は次のとおりです。

<?xml version="1.0" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body xmlns:tns="http://172.16.53.121/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://www.amtrak.com/TrainStatus/2006/01/01" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:wsdns1="http://www.amtrak.com/schema/2006/01/01" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <TrainStatusRQ xmlns="http://www.amtrak.com/schema/2006/01/01" xmlns:ota="http://www.opentravel.org/OTA/2003/05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="1.0" EchoToken="TestToken">
        <POS>
            <ota:Source>
                <ota:RequestorID Type="WAS" ID="ToBeProvidedByAmtrak">
                    <ota:CompanyName CompanyShortName="ToBeProvidedByAmtrak"/>
                </ota:RequestorID>
            </ota:Source>
        </POS>
        <TrainStatusInfo TrainNumber="3">
            <TravelDate>
                <ota:DepartureDateTime>2006-01-07</ota:DepartureDateTime>
            </TravelDate>
            <Location LocationCode="KNG"/> 
        </TrainStatusInfo>
    </TrainStatusRQ>
</SOAP-ENV:Body>

そして、私はそれをこのように使用すると呼びます

try
    {
       $client = new SoapClient($soapURL, $soapOptions);
       $trainStatus = $client->processTrainStatus($TrainStatusRQ);
       var_dump($trainStatus);
       //var_dump($client->__getTypes());

    }
    catch(SoapFault $e) 
    { 
        echo "<h2>Exception Error!</h2></b>"; 
        echo $e->faultstring; 
    }

属性とマルチレベルのパラメーターがあるため、$TrainStatusRQ のエンコードがわかりません。これは私が得たのと同じくらい近いです。

$RQStruc = array(
            "POS" => array(
                "Source"=> array(
                    "RequestorID" => array(
                        'type'=>'WAS',
                        'ID'=>'0',
                        'CompanyName'=>array(
                            'CompanyShortName'=>"0"
                        )
                    )
                )
            ),
            "TrainStatusInfo" => array( 
                'TrainNumber'=>$TrainNumber, 
                'TravelDate' => array(
                        'DepartureDateTime' => array(
                                '_' => $today
                         )
                ),
                "Location" => array(
                    'LocationCode'=>$LocationCode
                )

            ) 
     );

$TrainStatusRQ = new SoapVar($RQStruc, XSD_ANYTYPE, "TrainStatusRQ","http://www.amtrak.com/schema/2006/01/01" );
4

2 に答える 2

0

XML を XSD_ANYXML 型の文字列として渡すことが答えでした。また、SoapVar() 関数呼び出しの 3 番目と 4 番目のパラメーターを除外する必要がありました。

$XML =  '<TrainStatusRQ xmlns="http://www.amtrak.com/schema/2006/01/01" xmlns:ota="http://www.opentravel.org/OTA/2003/05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="1.0" EchoToken="TestToken">
            <POS>
                    <ota:Source>
                            <ota:RequestorID Type="WAS" ID="foo">
                                    <ota:CompanyName CompanyShortName="bat"/>
                            </ota:RequestorID>
                    </ota:Source>
            </POS>
            <TrainStatusInfo TrainNumber="'.$TrainNumber.'">
                    <TravelDate>
                            <ota:DepartureDateTime>'.$Today.'</ota:DepartureDateTime>
                    </TravelDate>

            </TrainStatusInfo>
        </TrainStatusRQ>';

$TrainStatusRQ = new SoapVar($XML,XSD_ANYXML);
于 2013-08-19T13:29:27.707 に答える
0

.NET サービスを扱うときにも同様の問題がありました。

私が最終的に得たのは、構造をプレーンストリングとして組み立てることでした。

 $p = array();
    foreach ($items as $item) {

        $p[] = "
        <MyEntity class='entity'> // the attribute was required by .NET 
          <MyId>{$item->SomeID}</MyId>
          <ItemId>{$item->ItemId}</ItemId>
          <Qty>{$item->Qty}</Qty>
        </MyEntity>";

    }
    $exp = implode("\n", $p);
    $params['MyEntity'] = new \SoapVar("<MyEntity xmlns='http://schemas.microsoft.com/dynamics/2008/01/documents/MyEntity'>$exp</MyEntity>", XSD_ANYXML);

問題なく動作しました。

于 2013-08-17T17:14:35.353 に答える