PHP SOAP传递同名参数:API调用中的XML节点构造难题
解决PHP SOAP请求中重复同名XML节点的问题
嘿,这个场景我太熟悉了!用PHP数组构造SOAP请求时,普通关联数组因为键名唯一,确实没法直接生成多个<fin:Criterion>这种同名节点,不过咱们换个思路就搞定了——用索引数组来包裹这些重复节点。
核心思路
SOAPClient在解析PHP数组生成XML时,会把索引数组自动转化为重复的同名XML元素。如果节点还包含属性(比如你的name="VALX"),我们需要用特定的数组结构来同时表示属性和节点文本内容。
具体实现代码
针对你给出的<fin:Criterions>结构,你可以这样构造数组:
$soapRequestArray = array( // 其他节点... 'Criterions' => array( 'Criterion' => array( // 第一个Criterion节点 array( 'name' => 'VALX', // 节点属性 '_' => '17' // 节点的文本内容,用下划线键表示 ), // 第二个Criterion节点 array( 'name' => 'VALY', '_' => '42' ), // 可以继续添加更多Criterion节点 array( 'name' => 'VALZ', '_' => '99' ) ) ), // 其他节点... );
关键细节说明
- 下划线
_是PHP SOAP数组的约定用法,用来表示XML节点的文本内容,当节点同时存在属性和文本时必须这么用。 - 如果你的
<fin:Criterion>没有属性,只是纯文本值,结构可以更简单:'Criterions' => array( 'Criterion' => array('17', '42', '99') )
验证生成的XML
你可以开启SOAPClient的trace选项,发送请求后查看实际生成的XML是否符合预期:
$client = new SoapClient('your_wsdl_url', array('trace' => true)); // 发送请求 $client->yourSoapFunction($soapRequestArray); // 打印最后一次请求的XML echo $client->__getLastRequest();
这样就能确认生成的XML里是否出现了多个<fin:Criterion>节点啦!
内容的提问来源于stack exchange,提问作者Eric Mars
相关产品推荐
相关产品推荐

