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 を返すとしたら、レビュアーの 5 番目のオカレンスが必要であるとどのように伝えればよいでしょうか? 検索してみましたが、正しい検索用語が得られず、少し行き詰まっています

乾杯

4

4 に答える 4

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;

Perl の配列インデックスの 0 からとは異なり、XPath の位置は 1 から始まることに注意してください。

于 2014-05-19T07:04:15.330 に答える
0

見返りに 5 を取得した場合、必要なことはノードを反復処理し、反復ごとにインクリメントするカウンターを保持することです。カウンターが 5 に達した場合、そのノードの情報を出力できます。

XML::LibXML::Nodeで確認findnodesしてください。

以下も参照してください。

  1. XML::LibXML を使用して xml ノードを反復処理する perl スクリプト

  2. XML::LibXML を使用してノードを反復処理する

于 2014-05-19T06:08:04.377 に答える