Perl,将一个元素附加到现有的 SOAP::D ata 元素



我正在努力使用Perl(v5.24.1( SOAP::Lite。 我正在尝试添加一个元素 现有数据元素。

假设我有以下构造:

use SOAP::Lite + qw/ trace /;  
my $soap = SOAP::Lite->new( proxy => 'http://soap.server.com');
$soap->on_action( sub { "http://tempuri.org/some" });
$soap->autotype(0)->readable(1);
$soap->default_ns('http://tempuri.org/');
$som = $soap->call('GetItems', SOAP::Data->name('Store')->attr( { 'xmlns'    => 'Some.Structs'} )->value(
SOAP::Data->value(
SOAP::Data->name('Items')->value(
SOAP::Data->value(
SOAP::Data->name('Available')->value('false'),
SOAP::Data->name('Apple')->value('1'),
SOAP::Data->name('Orange')->value('2'),
)),
)),   
);

但是现在我想添加项目的"N"元素,我想根据条件循环这样做,所以这只是一个例子,我尝试了以下内容:

use SOAP::Lite + qw/ trace /;  
my $soap = SOAP::Lite->new( proxy => 'http://soap.server.com');
$soap->on_action( sub { "http://tempuri.org/some" });
$soap->autotype(0)->readable(1);
$soap->default_ns('http://tempuri.org/');
my $data1= (SOAP::Data->name('Store')->attr( { 'xmlns' => 'Some.Structs'} )->value(
SOAP::Data->value(
SOAP::Data->name('Items')->value(
SOAP::Data->value(
SOAP::Data->name('Available')->value('false'),
SOAP::Data->name('Apple')->value('1'),
SOAP::Data->name('Orange')->value('2'),
)),
)),   
);
my $data2= (SOAP::Data->name('Store')->attr( { 'xmlns' => 'Some.Structs'} )->value(
SOAP::Data->value(
SOAP::Data->name('Items')->value(
SOAP::Data->value(
SOAP::Data->name('Available')->value('true'),
SOAP::Data->name('Bananas')->value('4'),
SOAP::Data->name('Pineapple')->value('2'),
)),
)),   
);

现在尝试添加元素

push $data1->value, data2;

push ($data1,$data1);

回报为:现在禁止对标量进行实验性推送....

最后,当元素加入时,我想发送它们,但我不确定这是否有效:

$som = $soap->call('GetItems', $data1);

任何帮助将不胜感激....

将元素附加到已经存在的 SOAP::D ata 复杂类型中的答案使用了实验性的取消引用样式(现已修复(。您需要使用以下语法:

push @{ $data1->value }, $data2

若要在事后追加到Items列表,可以使用以下方法手动沿行上面构建的数据结构并追加到相关列表:

push @{ ${ ${ $data1->value }->value->value }->{_value} }, $data2;

但我认为,只有在将所有有效负载数据放在一起后,才构造 SOAP 数据会更好。在循环的情况下,改为按如下方式构建程序:

my @payload;
for my $item (@items) {
push @payload, SOAP::Data->name( $item->{name} )->value( $item->{count}) if $item->{wanted};
};
my $soap = SOAP::Data->value( @payload );

在上面的示例中,我尝试了

push @{ $data1->value }, $data2;

但这导致

不是 .. 的数组引用。


如上所示,我将构建我的数据,例如:

my @payload;
push @payload, SOAP::Data->name('Store')->attr( { 'xmlns' => 'Some.Structs'} 
)->value(
SOAP::Data->value(
SOAP::Data->name('Items')->value(
SOAP::Data->value(
SOAP::Data->name('Available')->value('false'),
SOAP::Data->name('Apple')->value('1'),
SOAP::Data->name('Orange')->value('2'),
)),
));
#Now add the next element
push @payload, SOAP::Data->name('Store')->attr( { 'xmlns' => 'Some.Structs'} 
)->value(
SOAP::Data->value(
SOAP::Data->name('Items')->value(
SOAP::Data->value(
SOAP::Data->name('Available')->value('false'),
SOAP::Data->name('Orange')->value('1'),
SOAP::Data->name('Pianaple')->value('2'),
)),
));
$som = $soap->call('GetItems', @payload);

最新更新