2010-06-04 55 views
1

我data.xml中如何解析多记录的XML文件的UE XML ::简单的Perl中

<?xml version="1.0" encoding="ISO-8859-1"?> 
<catalog> 
    <cd country="UK"> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <price>10.0</price> 
    </cd> 
    <cd country="CHN"> 
    <title>Greatest Hits</title> 
    <artist>Dolly Parton</artist> 
    <price>9.99</price> 
    </cd> 
    <cd country="USA"> 
    <title>Hello</title> 
    <artist>Say Hello</artist> 
    <price>0001</price> 
    </cd> 
</catalog> 

我test.pl

#!/usr/bin/perl 

    # use module 
    use XML::Simple; 
    use Data::Dumper; 

    # create object 
    $xml = new XML::Simple; 

    # read XML file 
    $data = $xml->XMLin("data.xml"); 

    # access XML data 
    print "$data->{cd}->{country}\n"; 
    print "$data->{cd}->{artist}\n"; 
    print "$data->{cd}->{price}\n"; 
    print "$data->{cd}->{title}\n"; 

输出:

Not a HASH reference at D:\learning\perl\t1.pl line 16. 

评论:我谷歌搜索并找到了文章(处理单个XML记录)。 http://www.go4expert.com/forums/showthread.php?t=812 我使用文章代码进行了测试,它在我的笔记本电脑上运行得非常好。

然后,我创建了我的练习代码,以尝试访问多个记录。但失败了。我该如何解决它?谢谢。

+2

这里有一些方便的提示:http://www.perlmonks.org/index.pl?node_id=218480 – 2010-06-04 02:27:38

回答

5

始终use strict; ,总是use warnings;不要像你在做的那样引用复杂的参考。你是对的use Dumper;,它应该告诉你,cd是一个数组参考 - 你必须明确哪个CD。

#!/usr/bin/perl 
use strict; 
use warnings; 

# use module 
use XML::Simple; 
use Data::Dumper; 

# create object 
my $xml = new XML::Simple; 

# read XML file 
my $data = $xml->XMLin("file.xml"); 

# access XML data 
print $data->{cd}[0]{country}; 
print $data->{cd}[0]{artist}; 
print $data->{cd}[0]{price}; 
print $data->{cd}[0]{title}; 
+0

感谢您的详细解剖。 – 2010-06-04 03:09:17

2

如果你这样做print Dumper($data),你会看到数据结构并不像你想象的那样:

$VAR1 = { 
      'cd' => [ 
        { 
        'country' => 'UK', 
        'artist' => 'Bonnie Tyler', 
        'price' => '10.0', 
        'title' => 'Hide your heart' 
        }, 
        { 
        'country' => 'CHN', 
        'artist' => 'Dolly Parton', 
        'price' => '9.99', 
        'title' => 'Greatest Hits' 
        }, 
        { 
        'country' => 'USA', 
        'artist' => 'Say Hello', 
        'price' => '0001', 
        'title' => 'Hello' 
        } 
       ] 
     }; 

您需要访问的数据,像这样:

print "$data->{cd}->[0]->{country}\n"; 
print "$data->{cd}->[0]->{artist}\n"; 
print "$data->{cd}->[0]->{price}\n"; 
print "$data->{cd}->[0]->{title}\n"; 
2

除了什么已经由埃文说,如果你不确定,如果你坚持一个或多个元素,ref()可以告诉你它是什么,你可以相应处理:

my $data = $xml->XMLin("file.xml"); 

if(ref($data->{cd}) eq 'ARRAY') 
{ 
    for my $cd (@{ $data->{cd} }) 
    { 
     print Dumper $cd; 
    } 
} 
else # Chances are it's a single element 
{ 
    print Dumper $cd; 
}