0

次のようなXMLファイルを正しく解析するためのPerlスクリプトを作成するのに苦労しています。

<Report name="NAME">
<ReportHost name="UNIQUE_1"><HostProperties>
<tag name="TAG_1">tag_value</tag>
<tag name="TAG_2">tag_value</tag>
</ReportHost>
<ReportHost name="UNIQUE_2"><HostProperties>
<tag name="TAG_1">tag_value</tag>
<tag name="TAG_2">tag_value</tag>
</ReportHost>

今、私はそれらのUNIQUE_nをなんとかして呼び出すことができる必要がありますが、私は管理できませんでした。Dumperは、次のような構造を返します。

'Report' => {
            'ReportHost' => {
                             'UNIQUE_1' => {
                                           'HostProperties' => {
                                                               'tag' => { [...]

ForceArrayを試しましたが、ReportHostを配列にすることができず、惨めに失敗しました。

4

1 に答える 1

3

PerlがXMLを「正しく解析」するのに問題があるとあなたは言いますが、どのような結果が欲しいかは言いません。サンプルXMLにいくつかの終了タグがないという事実はさておき、おそらく次のようなものが必要です。

my $report = XMLin(\*DATA,
    ForceArray => [ 'ReportHost', 'tag' ],
    KeyAttr    => { tag => 'name' },
    ContentKey => '-content',
);

print Dumper($report);

これは次のようになります。

$VAR1 = {
      'ReportHost' => [
                      {
                        'HostProperties' => {
                                            'tag' => {
                                                     'TAG_1' => 'tag_value',
                                                     'TAG_2' => 'tag_value'
                                                   }
                                          },
                        'name' => 'UNIQUE_1'
                      },
                      {
                        'HostProperties' => {
                                            'tag' => {
                                                     'TAG_1' => 'tag_value',
                                                     'TAG_2' => 'tag_value'
                                                   }
                                          },
                        'name' => 'UNIQUE_2'
                      }
                    ],
      'name' => 'NAME'
};

そして、次のようにデータをループすることができます。

my $report_hosts = $report->{ReportHost};
foreach my $report_host ( @$report_hosts ) {
    print "Report: $report_host->{name}\n";
    my $props = $report_host->{HostProperties}->{tag};
    print "  TAG_1: $props->{TAG_1}\n";
    print "  TAG_2: $props->{TAG_2}\n";
}

ただし、別のモジュールを使用することをお勧めします:-)

于 2012-01-29T20:26:12.053 に答える