2012-06-26 48 views
0

我傾倒了以下XML結構。如何從XML :: Simple中提取數據結構中的屬性?

$VAR1 = { 
    'events' => {}, 
    'docvalues' => { 
     'docvalue' => { 
      'ENGLAND' => { 
       'doc' => { 
        'England' => { 
         'value1' => '0.70312', 
         'value2' => '52.16045', 
         'type' => 'other', 
         'rank' => '21' 
        }, 
        'New England District' => { 
         'value1' => '151.65', 
         'value2' => '-30.51667', 
         'type' => 'other', 
         'rank' => '18' 
        } 
       }, 
       'id' => 'rb5' 
      }, 
      'MS' => { 
       'contains' => 'rb7', 
       'abbrev-for' => 'Mississippi', 
       'doc'  => { 
        'Mississip pi' => { 
         'value1' => '31.64850330352783', 
         'value2' => '-91.29143524169922', 
         'type' => 'other', 
         'rank' => '8' 
        }, 
        'Mississippi County' => { 
         'value1' => '-89.31674', 
         'value2' => '36.81672', 
         'type' => 'other', 
         'rank' => '6' 
        } 
       }, 
       'id' => 'rb9' 
      } 
     } 
    } 
}; 

我堅持着如何從value1value2屬性提取值。我嘗試使用XML::Simple,但以散列值而不是屬性結束。

my $doclist = XMLin('my file.xml'); 
my $docvalues = $doclist->{docvalues}; 
my @docvalue = $docvalues->{docvalue}; 
my ($v1, $v2, $v3) = @_; 
foreach my $doc_value (@docvalue) { 
    my @doc = $doc_value->{doc}; 
    foreach my $values (@doc) { 
     $v1 = $values->{'value1'}; 
    } 
} 
+0

你嘗試過什麼?你看過[perldsc](http://perldoc.perl.org/perldsc.html)並理解hash參考如何工作? – Tim

回答

1

這是相當簡單的,但有點長。

foreach my $country (keys %{ $VAR1->{'docvalues'}->{'docvalue'} }) { 
    print "Country: $country\n"; 
    foreach my $doc (keys %{ $VAR1->{'docvalues'}->{'docvalue'}->{$country}->{'doc'} }) { 
    print "doc: $doc\n"; 
    print "value1: " . $VAR1->{'docvalues'}->{'docvalue'}->{$country}->{'doc'}->{$doc}->{'value1'} . "\n"; 
    print "value2: " . $VAR1->{'docvalues'}->{'docvalue'}->{$country}->{'doc'}->{$doc}->{'value2'} . "\n"; 
    } 
} 

輸出:

Country: ENGLAND 
doc: England 
value1: 0.70312 
value2: 52.16045 
doc: New England District 
value1: 151.65 
value2: -30.51667 
Country: MS 
doc: Mississip pi 
value1: 31.64850330352783 
value2: -91.29143524169922 
doc: Mississippi County 
value1: -89.31674 
value2: 36.81672 

關鍵是要檢查,事情再次發生。很明顯,似乎有好幾個國家,所以我們需要一個循環。然後每個國家都有一個叫doc的東西,裏面有兩個地區。我們必須循環這些,因爲他們持有value1value2


再次縮進增加redability,並在文本編輯器(小字體)縮小幫助了我。

my $VAR1 = { 
    'events' => {}, 
    'docvalues' => { 
    'docvalue' => { 
     'ENGLAND' => { 
     'doc' => { 
      'England' => { 
      'value1' => '0.70312', 
      'value2' => '52.16045', 
      'type' => 'other', 
      'rank' => '21' 
      }, 
      'New England District' => { 
      'value1' => '151.65', 
      'value2' => '-30.51667', 
      'type' => 'other', 
      'rank' => '18' 
      } 
     }, 
     'id' => 'rb5' 
     }, 
     'MS' => { 
     'contains' => 'rb7', 
     'abbrev-for' => 'Mississippi', 
     'doc'  => { 
      'Mississip pi' => { 
      'value1' => '31.64850330352783', 
      'value2' => '-91.29143524169922', 
      'type' => 'other', 
      'rank' => '8' 
      }, 
      'Mississippi County' => { 
      'value1' => '-89.31674', 
      'value2' => '36.81672', 
      'type' => 'other', 
      'rank' => '6' 
      } 
     }, 
     'id' => 'rb9' 
     } 
    } 
    } 
}; 
+0

請注意,多級取消引用中的箭頭是多餘的。您可以編寫'$ VAR1 - > {'docvalues'} {'docvalue'} {$ country} {'doc'} {$ doc} {'value1'}'。 – Tim

+0

我知道。但我發現與他們一起閱讀要容易得多。 – simbabque

+0

謝謝你,雖然更長的版本,適當的循環結構,它工作得很好! – pratz

0

你可以得到的值是這樣的:

print "$ref->{docvalues}->{docvalue}->{ENGLAND}->{doc}->{England}->{value1}\n"; 
print "$ref->{docvalues}->{docvalue}->{ENGLAND}->{doc}->{England}->{value2}\n"; 
print "$ref->{docvalues}->{docvalue}->{ENGLAND}->{doc}->{'New England District'}->{value1}\n"; 
print "$ref->{docvalues}->{docvalue}->{ENGLAND}->{doc}->{'New England District'}->{value2}\n"; 
print "$ref->{docvalues}->{docvalue}->{MS}->{doc}->{Mississippi}->{value1}\n"; 
print "$ref->{docvalues}->{docvalue}->{MS}->{doc}->{Mississippi}->{value2}\n"; 
相關問題