/ / Perl XML :: LibXML che ottiene l'ennesimo elemento - xml, perl, xml-libxml

Perl XML :: LibXML ottiene l'ennesimo elemento - xml, perl, xml-libxml

Ecco alcuni esempi di XML semplificato

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

Analizzo i dati

#!/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;

Ora voglio prendere i dettagli di un recensore casuale

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

Mando il numero 1 e $ no_of_critics su una subroutine che restituisce un numero casuale compreso tra uno e $ no_of_critics (cioè in questo caso 1 e 6)

Tutto questo funziona bene, devo solo sapere comedigli quale revisore: dì che restituisce 5, quindi come faccio a dirgli che voglio la quinta occorrenza del revisore? Ho provato a cercare ma non riesco a trovare il termine di ricerca corretto, quindi sono un po 'bloccato

Saluti

risposte:

0 per risposta № 1

Basandoti su ciò che hai già avuto nella tua domanda precedente:

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__

che potrebbe comportare:

recensore: Anne (Catfish wrangler)

godere!


0 per risposta № 2

Supponi di ottenere 5 in cambio, quindi di cosa hai bisognofare è iterare su nodi e mantenere un contatore che aumenta ad ogni iterazione, se il contatore raggiunge 5, è possibile stampare le informazioni di quel nodo.

Dai un'occhiata findnodes a XML :: :: LibXML Nodo.

Vedi anche:

  1. script perl per scorrere su nodi xml usando XML :: LibXML

  2. Scorrere su nodi usando XML :: LibXML


0 per risposta № 3

findnodes restituisce un array. Devi semplicemente selezionare quale indice dell'array vuoi:

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

0 per risposta № 4

È possibile utilizzare l'espressione XPath che specifica n-esimo elemento in un elenco:

#!/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;

Si noti che le posizioni in XPath iniziano da 1, diversamente da 0 come indici di array in Perl.