Arrays LITE可以从WCF解析对象数组

Arrays LITE可以从WCF解析对象数组,arrays,wcf,perl,object,Arrays,Wcf,Perl,Object,我对WCF服务的阵列值有一个小问题。我已经用WCF Storm测试了WCF。但是我需要perl中的它。我可以得到不在数组中的对象部分,但是当我尝试获得数组值时,它似乎跳到了第二个值。因为我可以看到接口2,但看不到存储的任何内容。任何建议都非常有用 #!/usr/bin/perl package main; use SOAP::Lite; # Variables my $url = 'http://<MyServerName>/Services/DCSP/DCSP.ServerMana

我对WCF服务的阵列值有一个小问题。我已经用WCF Storm测试了WCF。但是我需要perl中的它。我可以得到不在数组中的对象部分,但是当我尝试获得数组值时,它似乎跳到了第二个值。因为我可以看到接口2,但看不到存储的任何内容。任何建议都非常有用

#!/usr/bin/perl
package main;
use SOAP::Lite;
# Variables
my $url = 'http://<MyServerName>/Services/DCSP/DCSP.ServerManagement.svc?wsdl';
my $url_debug = 'http://localhost:11040/Service1.svc?wsdl';
my $uri = 'http://tempuri.org/';
my $xmlns = 'http://schemas.datacontract.org/2004/07/WcfService1';
my $selectedOS = 'Solaris';
# Setup Network Connection
my $soap = SOAP::Lite
-> uri($uri)
-> on_action(sub { sprintf '%sIServerManagement/%s', @_ })
-> proxy($url)
->autotype(0)->readable(1);

my $response = $soap->serverExists(SOAP::Data->new(name => '_serverNamee', value => '<ServerName>'));
# Print the Result
if ($response->fault)
{
 die $response->faultstring;
}
else
{
if($response->result > 0) {
        my $serverID = $response->result;
        my $buildserver = $soap->getServerById(SOAP::Data->new(name => '_id', value => $serverID));
        my $cpus = $buildserver->valueof('//*/CPUs');

        my $host = $buildserver->valueof('//*/Host');
        my $hostname = $buildserver->valueof('//*/HostName');
        my $memoryMB = $buildserver->valueof('//*/MemoryMB');
        my $OS = $buildserver->valueof('//*/OperatingSystem');
        my $stack = $buildserver->valueof('//*/Stack');
        my $status = $buildserver->valueof('//*/Status');
        my $tier = $buildserver->valueof('//*/Tier');
        my $arch = $buildserver->valueof('//*/architecture');
        my @interfaces = $buildserver->valueof('//*/*/systemInterface');
        my @mounts = $buildserver->valueof('//*/*/systemStorage');

        foreach $interface (@interfaces)
        {
                my $ipid = $interface->{'IPID'};
                my $position = $interface->{'Position'};
                my $ipaddress = $soap->getIpAddressByID(SOAP::Data->new(name => '_ID', value => $ipid));

                my $gateway = $ipaddress->valueof('//*/gateway');
                my $mask = $ipaddress->valueof('//*/mask');
                my $vlan = $ipaddress->valueof('//*/vlanID');
                my $ip = $ipaddress->valueof('//*/address');
        }
    foreach $mount (@mounts)
        {
                my $mountpoint = $mount->{'Anchor'};
                my $size = $mount->{'SizeMB'};
        }
}
}
#/usr/bin/perl
主包装;
使用SOAP::Lite;
#变数
我的$url=http:///Services/DCSP/DCSP.ServerManagement.svc?wsdl';
我的$url\uhttp://localhost:11040/Service1.svc?wsdl';
我的$urihttp://tempuri.org/';
我的$xmlnshttp://schemas.datacontract.org/2004/07/WcfService1';
我的$selectedOS='Solaris';
#设置网络连接
my$soap=soap::Lite
->uri($uri)
->关于操作(子{sprintf'%sIServerManagement/%s',@})
->代理($url)
->自动打字(0)->可读(1);
我的$response=$soap->serverExists(soap::Data->new(name=>'\u serverNamee',value=>'');
#打印结果
如果($response->fault)
{
die$response->faultstring;
}
其他的
{
如果($response->result>0){
my$serverID=$response->result;
我的$buildserver=$soap->getServerById(soap::Data->new(name=>''u id',value=>$serverID));
我的$CPU=$buildserver->valueof('/*/cpus');
my$host=$buildserver->valueof('/*/host');
我的$hostname=$buildserver->valueof('//*/hostname');
my$memoryMB=$buildserver->valueof('/*/memoryMB');
my$OS=$buildserver->valueof('//*/OperatingSystem');
我的$stack=$buildserver->valueof('//*/stack');
我的$status=$buildserver->valueof('//*/status');
我的$tier=$buildserver->valueof('//*/tier');
我的$arch=$buildserver->valueof('/*/architecture');
my@interfaces=$buildserver->valueof('//*/*/systemInterface');
my@mounts=$buildserver->valueof('//*/*/systemStorage');
foreach$接口(@interfaces)
{
my$ipid=$interface->{'ipid'};
my$position=$interface->{'position'};
我的$ipaddress=$soap->getIpAddressByID(soap::Data->new(name=>''u ID',value=>$ipid));
my$gateway=$ipaddress->valueof('//*/gateway');
我的$mask=$ipaddress->valueof('//*/mask');
我的$vlan=$ipaddress->valueof('/*/vlanID');
my$ip=$ipaddress->valueof('//*/address');
}
foreach$mount(@mounts)
{
我的$mountpoint=$mount->{'Anchor'};
my$size=$mount->{'SizeMB'};
}
}
}
WCF风暴的输出:

<getServerById>
  <MethodParameters>
    <virtualServer>
      <systemInterface attr0="NetworkInterfaceArray" isNull="false">
        <NetworkInterfaceArray0>
          <IPID>4</IPID>
          <Position>0</Position>
          <SystemID>3</SystemID>
          <id>11</id>
          <EntityKey>System.Data.EntityKey</EntityKey>
        </NetworkInterfaceArray0>
        <NetworkInterfaceArray1>
          <IPID isNull="true" />
          <Position>0</Position>
          <SystemID>3</SystemID>
          <id>19</id>
          <EntityKey>System.Data.EntityKey</EntityKey>
        </NetworkInterfaceArray1>
      </systemInterface>
      <systemSpecs>
        <CPUs>1</CPUs>
        <Host><HOST></Host>
        <HostName><HostName</HostName>
        <MemoryMB>2048</MemoryMB>
        <OperatingSystem>Solaris 10</OperatingSystem>
        <Stack>Development</Stack>
        <Status>Approved</Status>
        <Tier>Teir 1 (Front End)</Tier>
        <architecture>T-Series</architecture>
        <id>3</id>
        <EntityKey>System.Data.EntityKey</EntityKey>
      </systemSpecs>
      <systemStorage attr0="StorageArray" isNull="false">
        <StorageArray0>
          <Anchor>/def</Anchor>
          <SizeMB>2048</SizeMB>
          <SystemID>3</SystemID>
          <id>11</id>
          <EntityKey>System.Data.EntityKey</EntityKey>
        </StorageArray0>
      </systemStorage>
    </virtualServer>
  </MethodParameters>
</getServerById>

4.
0
3.
11
System.Data.EntityKey
0
3.
19
System.Data.EntityKey
1.

您的问题几乎无法回答,您需要在程序中发布一个示例响应

有关捕获数据的调试设置,请参阅

$soap->transport->add_handler("request_send",  \&pp_dump );
$soap->transport->add_handler("response_done", \&pp_dump );
sub pp_dump {
    my $content = $_[0]->content('');
    $_[0]->content( pp($content) );
    print $_[0]->as_string,"\n";
    return;
}
sub pp {
    use XML::Twig;
    open my($fh), '>', \my $str;
    no warnings 'newline';
    XML::Twig->new(qw! pretty_print record !)->xparse(@_)->print( $fh );
    return $str;
}

有关访问响应的调试设置,请参阅

my $xml = <<'__XML__';
<?xml version="1.0" encoding="UTF-8"?>
...
__XML__
my $response = SOAP::Custom::XML::Deserializer->deserialize( $xml );

my$xml=在调试过程中有很大帮助。答复补充说。
my $xml = <<'__XML__';
<?xml version="1.0" encoding="UTF-8"?>
...
__XML__
my $response = SOAP::Custom::XML::Deserializer->deserialize( $xml );