将元素追加到已存在的 SOAP::Data 复杂类型

Append an element to an already existing SOAP::Data complex type

我对 SOAP、PERL 以及我被要求做的几乎所有其他事情都很陌生,所以我希望有人能给我指出正确的方向。

我实现了一个简单的 WCF 解决方案,并且编写了一个 PERL 客户端,它使用 SOAP::lite 和 SOAP::Data 将 "complex data structure" 传递给解决方案。到目前为止,所有这些都运行良好,WCF 解决方案将数组视为一个数组,我能够在服务器端很好地遍历该数组。

但是,我在尝试将数据元素附加到 PERL 端的数组时遇到问题。我有以下代码,它构建了我需要的数组,但我需要稍后在代码中向数组追加几行,但我不知道该怎么做。

# build array of values
my $data= SOAP::Data->new
(name => 'array', value => 
   [
     SOAP::Data->new(name => 'elem:string', value => 'firststring'),
     SOAP::Data->new(name => 'elem:string', value => 'secondstring'),
     SOAP::Data->new(name => 'elem:string', value => 'thridstring')
   ]
) 
->attr
( 
   { 'xmlns:elem' => 'http://schemas.microsoft.com/2003/10/Serialization/Arrays','xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'}
);

# create a new element
my $elem1 = SOAP::Data->new(name => 'elem:string', value => 'addedstring');

# try to add the element
push(@{$data->{array}},$elem1);

#.... send, catch, print.. bla bla bla

我运行的代码,WCF 服务看到的数组很好,但 $elem1 值实际上从未附加到 SOAP 信封。

非常感谢任何帮助...

看看 $data 正在使用什么 Data::Dumper,你明白了

$VAR1 = bless( {
             '_attr' => {
                          'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance',
                          'xmlns:elem' => 'http://schemas.microsoft.com/2003/10/Serialization/Arrays'
                        },
             '_signature' => [],
             '_name' => 'array',
             '_value' => [
                           [
                             bless( {
                                      '_value' => [
                                                    'firststring'
                                                  ],
                                      '_name' => 'string',
                                      '_prefix' => 'elem',
                                      '_signature' => [],
                                      '_attr' => {}
                                    }, 'SOAP::Data' ),
                             bless( {
                                      '_value' => [
                                                    'secondstring'
                                                  ],
                                      '_name' => 'string',
                                      '_signature' => [],
                                      '_prefix' => 'elem',
                                      '_attr' => {}
                                    }, 'SOAP::Data' ),
                             bless( {
                                      '_attr' => {},
                                      '_value' => [
                                                    'thridstring'
                                                  ],
                                      '_name' => 'string',
                                      '_signature' => [],
                                      '_prefix' => 'elem'
                                    }, 'SOAP::Data' )
                           ]
                         ]
           }, 'SOAP::Data' );

没有$data->{array}

查看 SOAP::Data 的文档,说您应该使用 $data->value 访问您创建的数组。

push @{ $data->value }, $elem1;

print Dumper $data->value;

产量

$VAR1 = [
      bless( {
               '_attr' => {},
               '_prefix' => 'elem',
               '_value' => [
                             'firststring'
                           ],
               '_name' => 'string',
               '_signature' => []
             }, 'SOAP::Data' ),
      bless( {
               '_signature' => [],
               '_name' => 'string',
               '_value' => [
                             'secondstring'
                           ],
               '_prefix' => 'elem',
               '_attr' => {}
             }, 'SOAP::Data' ),
      bless( {
               '_name' => 'string',
               '_signature' => [],
               '_value' => [
                             'thridstring'
                           ],
               '_prefix' => 'elem',
               '_attr' => {}
             }, 'SOAP::Data' ),
      bless( {
               '_attr' => {},
               '_prefix' => 'elem',
               '_value' => [
                             'addedstring'
                           ],
               '_name' => 'string',
               '_signature' => []
             }, 'SOAP::Data' )
    ];

感谢 Gabs00,

push $data->value, $elem1;干得漂亮