从RPC :: XML :: request对象中检索参数

时间:2014-03-30 02:31:38

标签: perl xml-rpc

我是使用Perl的新手,目前正在尝试使用XML-RPC。任何人都可以帮我从SEQUENCE(应该是0)和LANGUAGE(应该是FRA)下面的样本中检索吗?

提前感谢您的帮助。

$VAR1 = bless( {
             'args' => [
                         bless( {
                                  'SEQUENCE' => bless( do{\(my $o = '0')}, 'RPC::XML::string' ),
                                  'LANGUAGE' => bless( do{\(my $o = 'FRA')}, 'RPC::XML::string' ),
                                  'END_OF_SESSION' => bless( do{\(my $o = 'FALSE')}, 'RPC::XML::string' ),

                                }, 'RPC::XML::struct' )
                       ],
             'name' => 'get.getMethod'
           }, 'RPC::XML::request' );

2 个答案:

答案 0 :(得分:1)

看来您的字符串可能是Data::Dumper的输出?无论来源如何,都可以使用eval将其转换为数据结构。

然后,只需要对RPC::XML文档进行一些解密就可以得到以下内容:

use strict;
use warnings;
use RPC::XML;

my $str = do { local $/; <DATA> };

my $req = do {
    no strict 'vars';
    eval $str;
} or die "Error in data, $@";

### You should already have a $req equivalent object.

my $hashref = ${$req->args}[0]->value;

while (my ($k, $v) = each %$hashref) {
    print "$k -> $v\n";
}

__DATA__
$VAR1 = bless( {
    'args' => [
        bless( {
            'SEQUENCE' => bless( do{\(my $o = '0')}, 'RPC::XML::string' ),
            'LANGUAGE' => bless( do{\(my $o = 'FRA')}, 'RPC::XML::string' ),
            'END_OF_SESSION' => bless( do{\(my $o = 'FALSE')}, 'RPC::XML::string' ),
        }, 'RPC::XML::struct' )
    ],
    'name' => 'get.getMethod'
}, 'RPC::XML::request' );

输出:

SEQUENCE -> 0
LANGUAGE -> FRA
END_OF_SESSION -> FALSE

答案 1 :(得分:0)

RPC :: XML的作者。

假设您的请求对象名为$req,您可以使用“args”方法获取参数列表:

my $args = $req->args;

由于您正在寻找第一个(也是唯一的参数)的数据,这是一个“struct”(哈希表),您可以在参数上使用索引[0],即$args->[0],作为哈希引用。

但是!这是请求对象,因此数据已经被编码为对象,以便在将请求发送到服务器时可以将其序列化。所以$args->[0]实际上是RPC::XML::struct类的一个对象。同样,结构中的值也已编码。这就是数据转储器输出显示对各种RPC :: XML :: *类的所有“祝福”调用的原因。

幸运的是,有一种方法,所有数据类都有共同点,称为value。更好的是,它以递归方式对RPC::XML::structRPC::XML::array的复合数据类型进行操作。这意味着在此特定参数对象上调用value不仅会为您提供普通的哈希引用,而且该哈希引用中的所有值都将是Perl本机类型而不是其他RPC :: XML :: *对象。

所以这会让你到达你想要的地方:

my $args    = $req->args;
my $hashref = $args->[0]->value;
# At this point, you can now access $hashref->{SEQUENCE} and $hashref->{LANGUAGE}

希望这有帮助。