更改从PHP SoapClient生成的输出XML的格式?

时间:2014-02-05 19:58:55

标签: php xml web-services soap soap-client

我正在努力创造这个:

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<AccessKey xmlns="http://eatright/membership" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Value>67a4ef47-9ddf-471f-b6d0-0000c28d57d1</Value>
</AccessKey>
</s:Header>
<s:Body>
<WebUserLogin xmlns="http://eatright/membership">
<loginOrEmail>1083790</loginOrEmail>
<password>thomas</password>
</WebUserLogin>
</s:Body>
</s:Envelope>

我创建了这个PHP代码

    class ChannelAdvisorAuth 
{ 
    public $AccessKey ; 

    public function __construct($key) 
    { 
        $this->AccessKey = $key; 
    } 
} 
$AccessKey     = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
$url         = "http://ws.eatright.org/service/service.svc?wsdl"; 
$client     = new SoapClient($url, array("trace" => 1, "exception" => 0)); 
$auth         = new ChannelAdvisorAuth($AccessKey); 
$header     = new SoapHeader("AccessKey", "Value", $AccessKey, false);
$client->__setSoapHeaders($header); 
$result = $client->ValidateAccessKey();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";

上述PHP代码的输出是:

    <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://eatright/membership" xmlns:ns2="AccessKey">
<SOAP-ENV:Header>
<ns2:Value>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</ns2:Value>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:ValidateAccessKey/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如何根据Web服务提供商的要求更改PHP代码以输出XML?

如何将“SOAP-ENV”替换为“S”?

有没有办法删除NS1和NS2?并调整XML的整个格式以满足要求?感谢

2 个答案:

答案 0 :(得分:0)

您不必担心SOAP-ENV,ns1或ns2 - 它们只是引用命名空间的前缀。只要完整的命名空间是正确的,它就会没问题。

我认为SOAP标题应该是这样的:

$access_key = new stdClass();
$access_key->Value = 'XXX';

$hdr = new SoapHeader('http://eatright/membership', 'AccessKey', $access_key);
$client->__setSoapHeaders($hdr);

我没有看到xmlns的目的:i在第一个例子中 - 没有具有XSI属性的元素。

我不知道该怎么处理身体。在第一个示例中,调用WebUserLogin操作,而在PHP代码中,您尝试调用ValidateAccessKey

您是否尝试过读取$ url指向的WSDL文件

答案 1 :(得分:0)

好的,我发现了问题,我会在这里添加,以防有人在寻找同样的问题。

$access_key = new stdClass();
$access_key->Value = 'xxxxxxxxxxxxxxxxxxx';
// Create the SoapClient instance 
$url         = "http://ws.eatright.org/service/service.svc?wsdl"; 
$client     = new SoapClient($url, array("trace" => 1, "exception" => 0)); 
$hdr = new SoapHeader('http://eatright/membership', 'AccessKey', $access_key);
$client->__setSoapHeaders($hdr);
$soapParameters = array('loginOrEmail ' => $username, 'password' => $password);
$login = new stdClass();
$login->loginOrEmail='LoginID';
$login->password='Password';
$result = $client->WebUserLogin($login);