为什么没有设置SOAP XML属性?

时间:2011-08-18 00:08:54

标签: xml perl soap

使用SOAP::Lite

创建SOAP时
#!/usr/bin/perl
use 5.006;
use strict;
use warnings;
use SOAP::Lite +trace => [ 'debug' ];

my $req1 = SOAP::Lite->new(
    readable => 1,
    autotype => 0,
    proxy    => 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor',
);

# req1 does not generate the XML attribute <item id="0"> it just generates
# <item>
$req1->requestMessage(
    \SOAP::Data->new(
        name => 'item',
        attr => { id => '0' },
        value => \SOAP::Data->new(
            name => 'foo',
            value => 1,
        ),
     ),
);

我得到这个XML (注意:这是重要的部分)

<item>
  <foo>1</foo>
</item>

我不明白为什么我没有得到这个XML

<item id="0">
   <foo>1</foo>
</item>

任何人都可以告诉我如何生成属性吗?

注意:这几乎相同(而不是命名属性id,它的名称为foo)代码有效。所以我认为这可能是bug

$req->requestMessage(
    \SOAP::Data->new(
        name => 'item',
        attr => { foo => '0' },
        value => \SOAP::Data->new(
            name => 'foo',
            value => 1,
        ),
     ),
);

2 个答案:

答案 0 :(得分:2)

更新: Fixed in 0.714

它与SOAP :: Lite或SOAP使用的东西相冲突

sub xmlize {
    my $self = shift;
    my($name, $attrs, $values, $id) = @{+shift};
    $attrs ||= {};

    local $self->{_level} = $self->{_level} + 1;
    return $self->tag($name, $attrs)
        unless defined $values;
    return $self->tag($name, $attrs, $values)
        unless UNIVERSAL::isa($values => 'ARRAY');
    return $self->tag($name, {%$attrs, href => '#'.$self->multiref_anchor($id)})
        if $self->is_href($id, delete($attrs->{_id}));
    return $self->tag($name,
        {
            %$attrs, id => $self->multiref_anchor($id)      <-------- Clobbers your id
        },
        map {$self->xmlize($_)} @$values
    );
}

我认为这就是你的身份丢失的地方。并且代码部分在0.714中改变了

答案 1 :(得分:0)

你能尝试在id附近加注?也许这会奏效。