0

私は XML を持っていて、彼のすべてのノードを出力したいのですが、ムービー ノード フィールドにアクセスしたいと思っています。

Name と City にはアクセスできますが、Movie フィールドにはアクセスできません。

<OnlineCinema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Cinema.xsd">
<Cinema>
    <City>Cluj</City>
    <Name>Cinema2</Name>
    <MovieName>ScaryMovie</MovieName>
    <Movie>
        <Name>ScaryMovie</Name>
        <Genre>comedie</Genre>
        <Director>lala</Director>
        <Writer>asdf</Writer>
        <Cast>asdvvb</Cast>
        <Year>2010</Year>
        <Trailer>http://www.youtube.com/embed/RMDZ8M47j0I</Trailer>
        <NRLoc>400</NRLoc>
    </Movie>
</Cinema>

コード:

use XML::Simple;
use Data::Dumper;

$xml = new XML::Simple (KeyAttr=>[]);
$data = $xml->XMLin("OnlineCinema.xml");
print "Content-type: text/html \n\n";

foreach $e (@{$data->{Cinema}}) {
    print "City: ", $e->{City}, "</br>\n";
    print "Name: ", $e->{Name}, "</br>\n"; 
    print "</br></br>\n";
}
4

2 に答える 2

3

XML::Simple は、最も使いにくい XML パーサーです。XML::LibXML を使用します。

use strict;
use warnings;

use XML::LibXML qw( );

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('OnlineCinema.xml');

for my $cinema ($doc->findnodes('/OnlineCinema/Cinema')) {
   my $cinema_name = $cinema->find('Name');
   my $cinema_city = $cinema->find('City');

   for my $movie ($cinema->findnodes('Movie')) {
      my $movie_name  = $movie->find('Name');
      my $movie_genre = $movie->find('Genre');

      print("$movie_name ($movie_genre) is playing at the $cinema_name in $cinema_city\n");
   }
}

(私はCinemaが複数のMovieを持つことができると仮定しましたが、CinemaにMovieNameが存在することを考えると、そうではないかもしれません。そうでない場合でも機能しますが、内側のループを排除したい場合があります。)for

于 2013-04-29T02:37:15.900 に答える