Search code examples
xmlperllibxml2xmldom

Iterate through XML data using Perl module XML::LibXML


Can anyone please translate this (XML::DOM to XML::LibXML)?

I have been at it for hours so I won't put up all of the code that I have tried as it would fill pages

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";
      }
    }

  }
}

and this is a basic representation of the 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>

Some of the things that I tried using XML::LibXML involved different versions of lines such as

foreach my $review ($review_details>findnodes('//display_name')) { 
  print $review->findvalue('movie_title')
}

Solution

  • I'd probably not use so many loops in 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';
    }
    

    Or, I'd use XML::XSH2, a wrapper around XML::LibXML:

    open file.xml ;
    for /results/review echo :s (movie_title) {"\n"} (reviewer) ;