【问题标题】:Append an element to an already existing SOAP::Data complex type将元素附加到已经存在的 SOAP::Data 复杂类型
【发布时间】:2015-01-21 21:52:33
【问题描述】:

我对 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 信封。

非常感谢任何帮助...

【问题讨论】:

    标签: perl web-services wcf soap soaplite


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      感谢 Gabs00,

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

      【讨论】:

        猜你喜欢
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-24
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        相关资源
        最近更新 更多