发送到 SOAP::D ata 的哈希数组



我正在向SOAP::D ata发送一个相当简单的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');

首先,你需要严格

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>

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

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

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

最新更新