首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从RPC::XML::request对象检索参数

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

Stack Overflow用户
提问于 2014-03-30 02:31:38
回答 2查看 119关注 0票数 0

我刚开始使用Perl,目前正在尝试使用XML。有人能帮我从下面的示例中检索到序列(应该是0)和语言(应该是FRA)吗?

提前谢谢你的帮助。

代码语言:javascript
复制
$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' );
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-30 03:36:43

您的字符串似乎是来自Data::Dumper的输出吗?不管源是什么,都可以使用eval将其转换为数据结构。

然后,只需对RPC::XML文档进行一点欺骗,就可以得到以下内容:

代码语言:javascript
复制
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' );

产出:

代码语言:javascript
复制
SEQUENCE -> 0
LANGUAGE -> FRA
END_OF_SESSION -> FALSE
票数 1
EN

Stack Overflow用户

发布于 2014-03-31 04:49:36

这里是RPC::XML的作者。

假设请求对象名为$req,则可以使用"args“方法获得参数列表:

代码语言:javascript
复制
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::*对象。

这样你就能到达你想去的地方:

代码语言:javascript
复制
my $args    = $req->args;
my $hashref = $args->[0]->value;
# At this point, you can now access $hashref->{SEQUENCE} and $hashref->{LANGUAGE}

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22739588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档