XML :: Простые и уникальные имена - PullRequest
0 голосов
/ 29 января 2012

Мне трудно создать Perl-скрипт для правильного разбора XML-файла, который выглядит следующим образом:

<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 массивом и с треском провалился.

1 Ответ

3 голосов
/ 30 января 2012

Вы говорите, что не можете заставить 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";
}

Я бы порекомендовал , используя другой модуль , хотя: -)

...