如何在Perl中解析多记录XML文件ues XML::Simple
My data.xml如何在Perl中解析多记录XML文件ues XML::Simple,perl,xml-parsing,xml-simple,Perl,Xml Parsing,Xml Simple,My data.xml <?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> &
<?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>
输出:
Not a HASH reference at D:\learning\perl\t1.pl line 16.
注释:我在谷歌上搜索并找到了这篇文章(处理单个xml记录)。
我用文章代码进行了测试,它在我的笔记本电脑上运行得很好
然后我创建了上面的练习代码,试图访问多个记录。但失败了。我怎样才能修好它?谢谢。如果您使用
打印转储程序($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";
如果执行打印转储程序($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";
始终
严格使用代码>,始终使用警告代码>不要像现在这样引用复杂的引用。您使用转储程序是对的
,它应该向您显示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};
始终严格使用代码>,始终使用警告代码>不要像现在这样引用复杂的引用。您使用转储程序是对的
,它应该向您显示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};
除了Evan所说的,如果您不确定自己是否被一个或多个元素所困扰,您可以告诉您这是什么,并且您可以相应地处理它:
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;
}
除了Evan所说的,如果您不确定自己是否被一个或多个元素所困扰,您可以告诉您这是什么,并且您可以相应地处理它:
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;
}
这里有一些有用的提示:这里有一些有用的提示:谢谢你的细节剖析。谢谢你的细节剖析。