我是使用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' );
答案 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::struct
和RPC::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}
希望这有帮助。