将元素附加到现有的SOAP :: Data复杂类型

时间:2015-01-21 21:52:33

标签: perl web-services wcf soap soaplite

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

我已经实现了一个简单的WCF解决方案,并且我编写了一个PERL客户端,它使用SOAP :: lite和SOAP :: Data将“复杂数据结构”传递给解决方案。到目前为止,所有这一切都运行良好,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信封。

非常感谢任何帮助...

2 个答案:

答案 0 :(得分:2)

看看使用Data :: Dumper的$ data是什么,你得到这个

$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' )
    ];

答案 1 :(得分:0)

感谢Gabs00,

推送$ data->值,$ elem1;工作得非常好