2

我正在向 SOAP::Data 发送一个相当简单的 Perl 散列,但我没有得到我想要的带有散列数组的 XML。这是我要发送的内容:

'hash' => {
     'Location' => [
         {
           'key1' => 'value1',
           'key2' => 'value2',
           'key3' => 'value3',
         },
         {
           'key1' => 'value1',
           'key2' => 'value2',
           'key3' => 'value3',
         },
      ],
}

这是我得到的:

<hash>
  <Location>
      <c-gensym9>
        <key1>value1</key1>
        <key2>value2</key2>
        <key3>value3</key3>
      </c-gensym9>
      <c-gensym10>
        <key1>value1</key1>
        <key2>value2</key2>
        <key3>value3</key3>
      </c-gensym10>
  </Location>
</hash>

但我想要的是这样的:

<hash>
    <Location>
      <key1>value1</key1>
      <key2>value2</key2>
      <key3>value3</key3>
    </Location>
    <Location>
      <key1>value1</key1>
      <key2>value2</key2>
      <key3>value3</key3>
    </Location>
</hash>

我错过了什么?我想如果我提供一些代码会有所帮助!:

my $hash = {};
my @Locations;
my @loc_codes = qw(0_4_10 0_51_117);

foreach my $l ( @loc_codes ) {
  my @arr = split ('_', $l);
  my $loc = {};
  $loc->{key1} = $arr[0];  # country
  $loc->{key2} = $arr[1];  # state
  $loc->{key3} = $arr[2];  # city

  push ( @Locations, $loc );
}

$hash->{Location} = \@Locations;  

my $soap_elements = SOAP::Data->value(
  SOAP::Data->name( 'some_method' => $hash )->prefix('p1')
)->prefix('p2');
4

2 回答 2

1

首先你需要严格

use strict;
use SOAP::Lite +trace => 'all';

my @loc_codes = qw(0_4_10 0_51_117);
my @Locations;

foreach my $l ( @loc_codes ) {
  my @arr = split ('_', $l);
  my $loc =
  SOAP::Data
    ->name("Location" => \SOAP::Data->value(
      SOAP::Data->name('key1', $arr[0]),
      SOAP::Data->name('key2', $arr[1]),
      SOAP::Data->name('key3', $arr[2])));

  push ( @Locations, $loc );
}

my $soap_elements;
$soap_elements = SOAP::Data->value(
      SOAP::Data->name( hash => \@Locations ));

my $serializer = SOAP::Serializer->new();
$serializer->readable('true');
my $xml = $serializer->serialize($soap_elements);
print $xml;

生成

<hash
  soapenc:arrayType="xsd:anyType[2]"
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:type="soapenc:Array">
 <Location>
  <key1 xsi:type="xsd:int">0</key1>
  <key2 xsi:type="xsd:int">4</key2>
  <key3 xsi:type="xsd:int">10</key3>
 </Location>
 <Location>
  <key1 xsi:type="xsd:int">0</key1>
  <key2 xsi:type="xsd:int">51</key2>
  <key3 xsi:type="xsd:int">117</key3>
 </Location>
</hash>

所以我认为你需要先构建你的数组元素

于 2013-10-07T20:34:13.203 回答
0

好吧,目前,SOAP::Data 并没有你想象的那么强大。它不能动态或递归地分析您的复合(复杂)数据结构,例如数组、哈希和标量值的嵌套。您只需将简单数据(标量值)传递给 SOAP::Data 或 SOAP::Data 实例已经由您自己手动组装,因此创建了一个嵌套的 SOAP::Data 结构;请参阅SOAP::Data 教程。

本教程对如何使用 SOAP::Data 处理复杂数据类型进行了简单而清晰的解释。但就个人而言,我不建议你使用 perl 作为soap 客户端。根据我之前的经验,perl 并没有完全支持 SOAP 协议,尤其是在处理复杂数据类型或更高版本的soap 1.2 时。 .相反,你最好使用java。java对最新的soap和复杂的数据类型有非常强大的支持。

于 2013-10-08T14:15:38.287 回答