Soap XML在PHP中传递引用

4
我是一名有用的助手,可以翻译文本。

我正在使用PHP中的SOAP调用Web服务,但我从服务器得到的响应是XML错误。

问题在于,在为请求创建XML时,Php会在XML中引入id,然后无论在哪里找到相同的节点,它都只会将id作为引用传递。

例如:-

<ns1:ChargeBU id=\"ref1\">
<ns1:ChargeBreakUp>
<ns1:PriceId>0</ns1:PriceId>
<ns1:ChargeType>TboMarkup</ns1:ChargeType>
<ns1:Amount>35</ns1:Amount>
</ns1:ChargeBreakUp><ns1:ChargeBreakUp>
<ns1:PriceId>0</ns1:PriceId>
<ns1:ChargeType>OtherCharges</ns1:ChargeType>
<ns1:Amount>0.00</ns1:Amount>
</ns1:ChargeBreakUp>
</ns1:ChargeBU>

然后当它找到相同的节点时,它会执行这个操作

<ns1:ChargeBU href=\"#ref1\"/>

那么,我该如何防止这种情况发生,以便它再次包含完整的节点,而不仅仅是传递引用?
4个回答

4
我也遇到了同样的问题,但在 SoapClient 中无法找到任何不同的解决方法。最终,我重写了 __doRequest() 方法,在发送 XML 之前修改它,以删除元素中的引用 ID,并将引用元素替换为它们所引用的元素。如果您这样做,请确保像 这里 所示修复 __getLastRequest()。
编辑:在发送之前使用 unserialize(serialize($input)) 似乎已经解决了我的问题。

2

您可以创建一个新的数组副本(实例),以防止PHP使用相同值的引用。

例如,我们有:

$item = array(
    "id" => 1,
    "name" => "test value"
);

我们的请求/响应:

$response = array(
    "item1" => $item,
    "item2" => $item
);

默认情况下,PHP将使用对item1的引用替换item2的值(两个项目都指向同一个数组)。

为了防止这种行为,我们需要创建两个具有相同结构的不同项目,例如:

function copyArray($source){
    $result = array();

    foreach($source as $key => $item){
        $result[$key] = (is_array($item) ? copyArray($item) : $item);
    }

    return $result;
}

请求和响应:

$response = array(
    "item1" => copyArray($item),
    "item2" => copyArray($item)
);

结构相同的项目实际上在内存中是不同的数组,在这种情况下,PHP 不会生成任何引用。


0

我稍微修改了这个函数,因为如果$source不是一个数组,在foreach循环中会出现小问题。

function copyArray(Array $source){
    $result = array();
    if($source) { // not for empty arrays
        foreach($source as $key => $item){
            $result[$key] = (is_array($item) ? copyArray($item) : $item);
        }
    }
    return $result;
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接