Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl XML::LibXML获取第n个元素_Xml_Perl_Xml Libxml - Fatal编程技术网

Perl XML::LibXML获取第n个元素

Perl XML::LibXML获取第n个元素,xml,perl,xml-libxml,Xml,Perl,Xml Libxml,下面是一些简化的xml示例 <book_reviewers> <results> <reviewer> <name>Anne</name> <profession>Catfish wrangler</profession> </reviewer> <reviewer>

下面是一些简化的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>
现在我想抓住一个随机评论者的细节

my $no_of_critics = ($critic_details->findvalue("count(/book_reviewers/results/reviewer)"));
我将数字1和$no_of_批评家发送到一个子程序,该子程序返回一个介于1和$no_of_批评家之间的随机数,即在本例中为1和6

所有这些都很好,我只需要知道我如何告诉它哪个审阅者-假设它返回5,那么我如何告诉它我想要第五个审阅者?我尝试过搜索,但是我找不到合适的搜索词,所以我有点卡住了


干杯

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

检查位于的findnodes

另见:

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>
...

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

#!/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开始不同。

建立在yu在上一个问题中已有的基础上:

严格使用; 使用警告; 使用utf8; 使用XML::LibXML; my$filename=cr.xml; my$parser=XML::LibXML->new; my$critic_details=$parser->parse_file$filename或die; 查找所有节点 my@reviewers=$Critical\u详细信息 ->FindNodeBook_评审员/结果/评审员; 在xml文件中没有reviewer节点,除非@reviewers; @标量上下文中的审阅者给出了元素的数量 my$reviewer=$reviewers[rand@reviewers]; printf审阅者:%s%s\n, $reviewer->findvaluename, $reviewer->findvalueprofession, ; __结束__ 这可能导致:

reviewer: Anne (Catfish wrangler)
享受吧

所有的答案都很好,谢谢-我开始想起来了 reviewer: Anne (Catfish wrangler)