Perl, добавьте элемент к существующему элементу SOAP::Data

Я борюсь с 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» элементов Items, я хочу, чтобы это было в цикле на основе условий, так что это просто пример, я пробовал следующее:

 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;

Or

push ($data1,$data1);

Возврат: Экспериментальная передача скаляра теперь запрещена....

Наконец, когда элементы соединены, я хотел бы отправить их, но я не уверен, что это сработает:

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

Любая помощь приветствуется ....


person Matt K    schedule 03.10.2018    source источник


Ответы (2)


Ответ в Добавить элемент в уже существующий сложный тип SOAP::Data использовал экспериментальный стиль разыменования (сейчас исправлено). Вам необходимо использовать следующий синтаксис:

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 );
person Corion    schedule 03.10.2018

На приведенном выше образце я попытался

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);
person MatthiasK    schedule 03.10.2018
comment
Насколько я понимаю SOAP::Data , вы не можете позже решить, хотите ли вы преобразовать скалярный элемент в элемент списка. Если ваше реальное намерение состоит в том, чтобы добавить к списку Items, вам нужно пройтись по построенной структуре данных и исправить это значение (см. мой обновленный ответ выше) - person Corion; 03.10.2018