0

次の XML 構造をダンプしました。

$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'
            }
        }
    }
};

value1およびvalue2属性から値を抽出する方法に行き詰まっています。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'};
    }
}
4

2 に答える 2

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、2 つの地域で呼ばれるものがあります。value1これらはandを保持しているため、これらをループする必要がありvalue2ます。


読みやすくするために再インデントし、テキスト エディター (小さいフォント) でズームアウトすることが役に立ちました。

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'
      }
    }
  }
};
于 2012-06-26T14:35:47.793 に答える
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";
于 2012-06-26T20:08:47.713 に答える