0

这是一些简化的示例 xml

<book_reviewers>
    <results>
        <reviewer>
            <name>Anne</name>
            <profession>Catfish wrangler</profession>
        </reviewer>
        <reviewer>
            <name>Bob</name>
            <profession>Beer taster</profession>
        </reviewer>
        <reviewer>
            <name>Charlie</name>
            <profession>Gardener</profession>
        </reviewer>
        <reviewer>
            <name>Don</name>
            <profession>DoGooder</profession>
        </reviewer>
        <reviewer>
            <name>Ellie</name>
            <profession>Elephant Trainer</profession>
        </reviewer>
        <reviewer>
            <name>Freddy</name>
            <profession>Fencer</profession>
        </reviewer>
    </results>
</book_reviewers>

他们我解析数据

#!/usr/bin/perl
use XML::LibXML;
use strict;

my $filename = "cr.xml";

my $parser = XML::LibXML->new();
my $critic_details = $parser->parse_file("$filename") or die;

现在我想获取随机审稿人的详细信息

my $no_of_critics = ($critic_details->findvalue("count(/book_reviewers/results/reviewer)"));

我将数字 1 和 $no_of_critics 发送到一个子程序,该子程序返回一个介于 1 和 $no_of_critics 之间的随机数(即在这种情况下为 1 和 6)

所有这一切都很好我只需要知道我如何告诉它哪个审阅者 - 说它返回 5,那么我如何告诉它我想要第五次出现审阅者?我试过搜索,但我找不到正确的搜索词,所以我有点卡住了

干杯

4

4 回答 4

0

假设你得到 5 作为回报,那么你需要做的是迭代节点并保持一个在每次迭代时递增的计数器,如果计数器达到 5,那么你可以打印出该节点的信息。

检查XML:: LibXML ::Nodefindnodes

另见:

  1. perl 脚本使用 XML::LibXML 遍历 xml 节点

  2. 使用 XML::LibXML 遍历节点

于 2014-05-19T06:08:04.377 回答
0

findnodes返回一个数组。你只需要选择你想要的那个数组的索引:

use strict;
use warnings;

use XML::LibXML;

my $dom = XML::LibXML->load_xml(IO => \*DATA);

my @reviewers = $dom->findnodes('//reviewer');
print "Count = " . @reviewers . "\n";

my $i = int rand @reviewers;
my $record = $reviewers[$i];
print $record, "\n";

__DATA__
<book_reviewers>
    <results>
        <reviewer>
            <name>Anne</name>
            <profession>Catfish wrangler</profession>
        </reviewer>
...
于 2014-05-19T07:02:21.790 回答
0

您可以使用指定列表中第 n 个元素的 XPath 表达式:

#!/usr/bin/perl
use warnings;
use strict;

use XML::LibXML;

my $filename = 'cr.xml';

my $parser         = 'XML::LibXML'->new();
my $critic_details = $parser->parse_file($filename) or die;
my $index          = 1 + int rand $critic_details->findvalue('count(/book_reviewers/results/reviewer)');
my $reviewer       = $critic_details->findnodes("/book_reviewers/results/reviewer[$index]");
print $reviewer;

请注意,XPath 中的位置从 1 开始,与 Perl 中的数组索引从 0 开始不同。

于 2014-05-19T07:04:15.330 回答
0

建立在 yu 在您之前的问题中已有的基础之上:

use strict;
use warnings;

use utf8;

use XML::LibXML;

my $filename = "cr.xml";

my $parser = XML::LibXML->new();
my $critic_details = $parser->parse_file("$filename") or die;

# find ALL the <book_reviewers><results><reviewers> nodes
my @reviewers = $critic_details
  ->findnodes("book_reviewers/results/reviewer");
die "no reviewer nodes in xml-file" unless @reviewers;

# @reviewers in scalar context gives the number of elements
my $reviewer = $reviewers[ rand @reviewers ];

printf "reviewer: %s (%s)\n",
  $reviewer->findvalue("name"),
  $reviewer->findvalue("profession"),
  ;

__END__

这可能导致:

审稿人:安妮(鲶鱼牧马人)

请享用!

于 2014-05-19T08:40:13.347 回答