NuSoap - addComplexType 中允许嵌套数组吗?

use*_*968 5 php xml nusoap

我需要从客户端接收这样的 XML 输入(包含 2 个或更多元素):

<list>
  <item>
      <code xsi:type="xsd:string">123</code>
      <product xsi:type="xsd:string">hello</product>
      <level xsi:type="xsd:float">3</level> 
  </item>

  <item>
      <code xsi:type="xsd:string">1234</code>
      <product xsi:type="xsd:string">hello2</product>
      <level xsi:type="xsd:float">4</level> 
  </item>
</list>
Run Code Online (Sandbox Code Playgroud)

我可以定义一个像这样的复杂类型来描述服务方法的输入参数(使用数组(数组(...)?

     $server->wsdl->addComplexType(
       '姓名',
       '复杂类型',
       '结构',
       '全部',
       '',
        数组(数组(
          '代码' => 数组('名称' => '代码', '类型' => 'xsd:string'),
          '产品' => 数组('名称' => '产品', '类型' => 'xsd:string'),
          'level' => array('name' => 'level', 'type' => 'xsd:float')
      ))
    );
    $server->register('updateCode', // 方法名称
             array('name' => 'tns:name'), // 输入参数
             array('return' => 'xsd:string'), // 输出参数
             'urn:updateCode', // 命名空间
             'urn:updatecode#updateCode', //soapaction
             'rpc', // 样式
             '编码' // 使用

    );

    函数更新代码($输入){
            返回计数($输入);
    }

当我使用包含 2 个项目的 XML 时,我得到 2 作为响应;当我使用仅包含 1 个项目的 XML 时,我获得 3 作为响应(如每个项目的字段数量),而我期望结果为 1。

我不明白为什么会出现这种情况。

谢谢,

小智 1

问题有点老了,但我正在研究一些遗留的肥皂服务并遇到了它。

这个答案可能会有所帮助:https ://stackoverflow.com/a/1505720/1666805

问题 1) 您需要声明 2 个复杂类型,其中第一个是“列表”:

$soap->wsdl->addComplexType(
    'list',
    'complexType',
    'array',
    '',
    'SOAP-ENC:Array',
    array(
        'list' => array(
          'name' => 'list', 'type' => 'tls:item'
        )
     ),
     array(
        array(
            'ref'=>'tns:item',
            'wsdl:arrayType'=>'tns:item[]'
        )
     ),
   'tns:item'
);
Run Code Online (Sandbox Code Playgroud)

第二个有参数“element”:

$soap->wsdl->addComplexType(
    'item',
    'element',
    'struct',
    'all',
    '',
    array(
        'code' => array('name' => 'code', 'type' => 'xsd:string'),
        'product' => array('name' => 'product', 'type' => 'xsd:string'),
        'level' => array('name' => 'level', 'type' => 'xsd:float')
    )
);
Run Code Online (Sandbox Code Playgroud)

从这里开始,使用上面的列表类型作为输入来注册函数应该很容易。

问题 2)我会查看传递给函数的实际数组而不是计数:

array(1) {
  'item' =>
  array(2) {
    [0] =>
    array(3) {
      'code' =>
      string(3) "123"
      'product' =>
      string(5) "hello"
      'level' =>
      double(3)
    }
    [1] =>
    array(3) {
      'code' =>
      string(4) "1234"
      'product' =>
      string(6) "hello2"
      'level' =>
      double(4)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)