Perl,将元素附加到现有SOAP :: Data元素

时间:2018-10-03 14:11:58

标签: perl web-services soap soaplite

我正在为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);

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

2 个答案:

答案 0 :(得分:1)

Append an element to an already existing SOAP::Data complex type中的答案使用了一种实验性的解引用方式(现已修复)。您需要使用以下语法:

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 );

答案 1 :(得分:0)

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

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

但这导致

  

不是..的ARRAY参考。


根据上面的建议,我将像这样构建数据:

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);