如何解析多记录的XML文件的UE XML ::简单的Perl中
问题描述:
我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 我使用文章代码进行了测试,它在我的笔记本电脑上运行得非常好。
然后,我创建了我的练习代码,以尝试访问多个记录。但失败了。我该如何解决它?谢谢。
答
始终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
答
如果你这样做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";
答
除了什么已经由埃文说,如果你不确定,如果你坚持一个或多个元素,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;
}
这里有一些方便的提示:http://www.perlmonks.org/index.pl?node_id=218480 – 2010-06-04 02:27:38