2010-06-04 51 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; 
}