2013-04-28 19 views
0

解析複雜的XML我有一個XML,我想打印他的所有節點,我想訪問節點的電影領域。在Perl

我可以訪問名稱和城市,但我不能老是進入電影領域。

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

XML ::簡單是不推薦的,也許嘗試一些XML ::基於效果會更好分析器。 – MkV 2013-04-28 22:46:06

回答

0

試一下:

use XML::Simple qw(:strict); 
use Data::Dumper; 

$xml = new XML::Simple (KeyAttr => [], ForceArray => [qw(Cinema)]); 
$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"; 
} 

基本上,你問要經過你的XML Cinema條目的陣列,但在這種情況下,因爲有隻有其中一個,它被構建爲單個標量值。該ForceArray選項告訴libray更精確地考慮條目作爲一個元素的數組,或者,美聯儲用於腳本的任何XML中,Cinema標籤(S)將始終制成的標籤陣列,是否有一個或多個他們。該選項可採取:

  • 必須被迫陣列標記名稱的數組,
  • 1用它強制所有標籤,
  • 0不使用它(這是默認值)

哦,加在你的XML年底關閉OnlineCinema標籤有它正確分析。

3

XML ::簡單是最難的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"); 
    } 
} 

(我假設一個影院可以有不止一個電影,但鑑於的movieName電影存在,這可能並非如此,它仍然會工作,如果它是不是這樣的,但你可能想消除內for循環。)