我正在向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对最新的肥皂和复杂的数据类型有非常强大的支持。