0

我有一个 XML,我想打印他的所有节点,我想访问电影节点字段。

我可以访问名称和城市,但我无法访问电影字段。

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

基本上,您要求遍历Cinemaxml 中的条目数组,但在这种情况下,由于只有其中一个,因此它被构建为单个标量值。该ForceArray选项告诉库将该条目视为一个元素数组,或者更准确地说,对于提供给脚本的任何 xml,Cinema标签将始终作为标签数组制作,无论它们中有一个或多个。该选项可能需要:

  • 必须强制为数组的标签名称数组,
  • 1强制它到所有标签,
  • 0不使用它(这是默认设置)

哦,并OnlineCinema在 xml 的末尾添加一个结束标记以正确解析它。

于 2013-04-28T22:55:26.453 回答