我刚开始使用Perl,目前正在尝试使用XML。有人能帮我从下面的示例中检索到序列(应该是0)和语言(应该是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' );发布于 2014-03-30 03:36:43
您的字符串似乎是来自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发布于 2014-03-31 04:49:36
这里是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}希望这能有所帮助。
https://stackoverflow.com/questions/22739588
复制相似问题