【问题标题】:Retrieving parameters from RPC::XML::request object从 RPC::XML::request 对象检索参数
【发布时间】:2026-02-09 10:05:01
【问题描述】:

我是使用 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' );

【问题讨论】:

  • 请说明您尝试了哪些方法,哪些方法不起作用,并附上您的相关代码。

标签: perl xml-rpc


【解决方案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

【讨论】:

    【解决方案2】:

    这里是 RPC::XML 的作者。

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

    my $args = $req->args;
    

    由于您要从第一个(也是唯一的参数)中查找数据,它是一个“结构”(哈希表),您可以在参数上使用索引[0],即$args-&gt;[0],作为哈希引用.

    但是!这是请求object,因此数据已经被编码为一个对象,以便在请求发送到服务器时可以对其进行序列化。所以$args-&gt;[0] 实际上是RPC::XML::struct 类的一个对象。同样,结构中的值也已编码。这就是为什么 data-dumper 输出会显示对各种 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}
    

    希望这会有所帮助。

    【讨论】: