Итерация по данным XML с использованием модуля Perl XML::LibXML
Может кто-нибудь, пожалуйста, переведите это (XML::DOM
в XML::LibXML
)?
Я занимался этим часами, поэтому я не выложу весь код, который я пробовал, так как он будет заполнять страницы
foreach my $review ($review_details->getElementsByTagName("review")) { # find the node review{
# scroll through each review to get the details that we want
foreach my $details ($review->getChildNodes) {
if ($details->getNodeName eq "movie_title") {
foreach my $movie_title ($details->getChildNodes) {
print $movie_title->getNodeValue . "\n";
}
}
if ($details->getNodeName eq "reviewer") {
foreach my $reviewer ($details->getChildNodes) {
print $reviewer->getNodeValue . "\n";
}
}
}
}
и это базовое представление данных
<results>
<review>
<movie_title>First Movie</movie_title>
<reviewer>Annie</reviewer>
</review>
<review>
<movie_title>Second Movie</movie_title>
<reviewer>Bob</reviewer>
</review>
<review>
<movie_title>Third Movie</movie_title>
<reviewer>Charlie</reviewer>
</review>
<review>
<movie_title>Fourth Movie</movie_title>
<reviewer>Don</reviewer>
</review>
</results>
Некоторые из вещей, которые я пытался использовать XML::LibXML
задействованы разные версии линий, такие как
foreach my $review ($review_details>findnodes('//display_name')) {
print $review->findvalue('movie_title')
}
2 ответа
Решение
Я бы, вероятно, не использовал так много циклов в XML::LibXML:
#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
my $review_details = 'XML::LibXML'->load_xml( location => shift );
for my $review ($review_details->findnodes('/results/review')) {
print $review->findvalue($_), "\n" for 'movie_title', 'reviewer';
}
Или я бы использовал XML:: XSH2, обертку вокруг XML::LibXML:
open file.xml ;
for /results/review echo :s (movie_title) {"\n"} (reviewer) ;
Это очень просто, если вы используете выражения XPath и перебираете все review
элементы.
use strict;
use warnings;
use XML::LibXML;
my $doc = XML::LibXML->load_xml(IO => *DATA);
for my $review ( $doc->findnodes('/results/review') ) {
print $review->findvalue('movie_title'), "\n";
print $review->findvalue('reviewer'), "\n";
}
__DATA__
<results>
<review>
<movie_title>First Movie</movie_title>
<reviewer>Annie</reviewer>
</review>
<review>
<movie_title>Second Movie</movie_title>
<reviewer>Bob</reviewer>
</review>
<review>
<movie_title>Third Movie</movie_title>
<reviewer>Charlie</reviewer>
</review>
<review>
<movie_title>Fourth Movie</movie_title>
<reviewer>Don</reviewer>
</review>
</results>
выход
First Movie
Annie
Second Movie
Bob
Third Movie
Charlie
Fourth Movie
Don