PHP soapClient和序列问题

PHP soapClient和序列问题,php,soap,Php,Soap,我在这里通读了一些其他解决方案,这些解决方案似乎与我遇到的问题相似,但似乎都不起作用。无论如何,我需要调用一个soap函数,该函数具有一系列与父元素同名的元素,并且这些元素的名称中都有一个“.”。下面是wsdl的一部分,我似乎无法理解如何创建一个类似于所需的数组 另外,“option.list”的子数组的出现次数总是不同的,所以我需要用php中的某种循环来构建它。非常感谢您的帮助 <xs:element minOccurs="0" name="option.list"> <xs

我在这里通读了一些其他解决方案,这些解决方案似乎与我遇到的问题相似,但似乎都不起作用。无论如何,我需要调用一个soap函数,该函数具有一系列与父元素同名的元素,并且这些元素的名称中都有一个“.”。下面是wsdl的一部分,我似乎无法理解如何创建一个类似于所需的数组

另外,“option.list”的子数组的出现次数总是不同的,所以我需要用php中的某种循环来构建它。非常感谢您的帮助

<xs:element minOccurs="0" name="option.list">
<xs:complexType>
    <xs:complexContent>
        <xs:extension base="cmn:ArrayType">
            <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" name="option.list">
                    <xs:complexType>
                        <xs:complexContent>
                            <xs:extension base="cmn:StructureType">
                                <xs:sequence>
                                    <xs:element minOccurs="0" name="SubItemId" nillable="true" type="cmn:DecimalType"/>
                                    <xs:element minOccurs="0" name="SubOptions" nillable="true" type="cmn:StringType"/>
                                    <xs:element minOccurs="0" name="SubItemName" nillable="true" type="cmn:StringType"/>
                                </xs:sequence>
                            </xs:extension>
                        </xs:complexContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
</xs:element>

我尝试过的想法:

for($i=0;$i<count($options);$i++)
{
    $option_list[] = array(
      "option.list" => array(
      "SubItemId" => $i,
      "SubOptions" => $options[$i]['suboptions'],
      "SubItemName" => $options[$i]['subitemname']
      )
);
}

$instance = array(
    "option.list"=>$option_list
);
$i=0;$i数组的
(
“SubItemId”=>$i,
“子选项”=>$options[$i]['SubOptions'],
“SubItemName”=>$options[$i]['SubItemName']
)
);
}
$instance=array(
“选项列表”=>$option\u列表
);
当我调试请求时,它会不断显示我正在发送的内容:

<ns1:option.list><ns1:option.list/></ns1:option.list>

另外,这也是option.list数组在发送前打印时的样子,如果这有帮助的话

                [option.list] => Array
                    (
                        [0] => stdClass Object
                            (
                                [option.list] => stdClass Object
                                    (
                                        [SubItemId] => 0
                                        [SubOptions] => <?xml version="1.0" encoding="UTF-8" standalone="yes"?><form><select id="DBMS" label="DBMS type:" style="combo">MS SQL<option label="" /><option id="0" label="DB2">DB2</option><option id="1" label="IMS">IMS</option><option id="2" label="MS SQL">MS SQL</option><option id="3" label="Oracle">Oracle</option><option id="4" label="UDB">UDB</option></select><select id="Type" label="lation Type:" style="combo">Add New Instance<option label="" /><option id="0" label="Add New Environment">Add New Environment</option><option id="1" label="Add New Instance">Add New Instance</option><option id="2" label="Add New Database">Add New Database</option><option id="3" label="Modify Environment">Modify Environment</option><option id="4" label="Modify Instance">Modify Instance</option><option id="5" label="Modify Database">Modify Database</option><option id="6" label="Retire Environment">Retire Environment</option><option id="7" label="Retire Instance">Retire Instance</option><option id="8" label="Retire Database">Retire Database</option></select><select id="Complexity" label="xity:" style="combo">Complex [+$2500.00]<option label="" /><option id="0" label="Simple [+$500.00]">Simple [+$500.00]</option><option id="1" label="Medium [+$1000.00]">Medium [+$1000.00]</option><option id="2" label="Complex [+$2500.00]">Complex [+$2500.00]</option></select><select id="RecoveryTier" label="rability Tier:" style="combo">Tier 2<option label="" /><option id="0" label="Tier 1">Tier 1</option><option id="1" label="Tier 2">Tier 2</option><option id="2" label="Tier 3">Tier 3</option></select><select id="Backup" label=" Backup Required?" style="combo">Yes<option label="" /><option id="0" label="Yes">Yes</option><option id="1" label="No">No</option></select><select id="Replication" label=" tables require replication?" style="combo">UDB Dprop<option label="" /><option id="0" label="UDB Dprop">UDB Dprop</option><option id="1" label="Goldengate">Goldengate</option><option id="2" label="ASM">ASM</option><option id="3" label="No">No</option></select></form>
                                        [SubItemName] => DB Modification
                                    )

                            )

                    )
[option.list]=>数组
(
[0]=>stdClass对象
(
[option.list]=>stdClass对象
(
[子项ID]=>0
[子选项]=>MS SQLDB2IMMS SQLOracleUDBAdd新实例添加新环境添加新实例添加新数据库修改环境修改实例修改数据库退役环境退役实例轮胎数据库复杂[+$2500.00]简单[+$500.00]中等[+$1000.00]复杂[+$2500.00]第2层第1层第3层是Syesnoudb DPROPDGOLDENGATEASNO
[子项名称]=>数据库修改
)
)
)

我从来都不知道如何从对象或数组中获取所需的soapEnvelope。但是作为一种功能性的解决方法,我能够将SoapClient子类化并重写_doRequest方法。这允许我发送自己的原始xml请求,该请求现在正在工作


我在这里找到了解决方法:

我建议使用以下代码,但我没有尝试:

for($i=0;$i<count($options);$i++) {
    $option_list[] = array(
       "SubItemId" => $i,
       "SubOptions" => $options[$i]['suboptions'],
       "SubItemName" => $options[$i]['subitemname']
    )
}

$instance = array(
    "option.list"=>$option_list
);
对于($i=0;$i$i),
“子选项”=>$options[$i]['SubOptions'],
“SubItemName”=>$options[$i]['SubItemName']
)
}
$instance=array(
“选项列表”=>$option\u列表
);
我认为您不必使父数组具有键“option.list”。 名称“option.list”仅用于wsdl类型引用本身,但根本不发送。 wsdl只是告诉您:“option.list”类型是关联数组的基数数组:

array(
    array(
        'SubItemId' => <DECIMAL>,
        'SubOptions' => '<STRING>',
        'SubItemName' => '<STRING>'
    ),
    array(
        'SubItemId' => <DECIMAL>,
        'SubOptions' => '<STRING>',
        'SubItemName' => '<STRING>'
    ),
    array(
        'SubItemId' => <DECIMAL>,
        'SubOptions' => '<STRING>',
        'SubItemName' => '<STRING>'
    ),
    ...,
    ...
)
数组(
排列(
'子项ID'=>,
“子选项”=>“”,
'子项名称'=>'
),
排列(
'子项ID'=>,
“子选项”=>“”,
'子项名称'=>'
),
排列(
'子项ID'=>,
“子选项”=>“”,
'子项名称'=>'
),
...,
...
)

这是我最后一次尝试的一个片段。。。。无法将其添加到此评论中。。现在正在编辑我的原始帖子。它不断显示这是我正在发送的内容-你正在发送的内容是你打算发送的吗?你会包括调用SoapClient的代码吗?不,这不是我所期望的,它应该发送的是0转义xml Herdeb Modification任何人都不知道如何创建一个将转换为以下内容的对象:0转义xml Herdeb Modification我遇到过类似的事情。到目前为止,对我来说唯一有效的方法是扩展
SoapClient
,而不是覆盖
\uuuusoapcall
,并在
\uuuu doRequest
之前调整XML请求(即:一些str替换等)。另外,看看
SoapVar
SoapParam
——它们几乎让我摆脱了这种解决方法。一旦我弄清楚如何完全克服这个问题,我就可以发布一个最终答案。