помощь в разборе - PullRequest
       3

помощь в разборе

0 голосов
/ 24 августа 2010

У меня есть XML-файл, как показано ниже,

<message1>
<val1>100</val1>
<val2>200</val2>
<val3>300</val3>
<val4>400</val4>
</message1>

<message2>
<val1>100</val1>
<val2>200</val2>
<val3>300</val3>
<val4>400</val4>
</message2>

Я должен проанализировать значения (val), и я не могу использовать модуль XML :: Simple.Разбор должен начинаться с <message1>, и я должен поместить значения в массив до </message1>, а затем я должен повторить это для <message2> до </message2>.

Наглядно это похоже на

<message1>
   ----100
   ----200
   ----300
   ----400
</message1>

<message2>
   ----100
   ----200
   ----300
   ----400
</message2>

Может ли кто-нибудь помочь мне .. Я много борюсь

Спасибо

Сентил Кумар

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Так как мы вернулись в 1999 году, я думаю, что я забуду о строгих и предупреждениях, использую символические ссылки и строку eval и покончу с этим:

#!/usr/bin/perl

while( <DATA>)
  { s{<(message\d)>}{\@$1=(}; # @message1=(
    s{<val\d>}{};             #
    s{<\/val\d>}{,};          #                ,
    s{</message\d>}{);};      #                 );
    $s.=$_;
  };

eval $s;

$,= ", "; $\= "\n";
foreach (1..2) { print "\@message$_: ", @{"message$_"}; }



__DATA__
<message1>
<val1>100</val1>
<val2>200</val2>
<val3>300</val3>
<val4>400</val4>
</message1>

<message2>
<val1>100</val1>
<val2>200</val2>
<val3>300</val3>
<val4>400</val4>
</message2>

(в случае, если неясно: это шутка! Как говорится: «Вы пытались использовать вместо этого анализатор XML?»)

1 голос
/ 24 августа 2010

Предполагая, что ваш ввод является полностью регулярным, как вы показываете, следующее должно работать. Но вам гораздо лучше заставить настоящий XML-парсер работать, обернув корневой элемент вокруг всего вашего контента или проанализировав каждое сообщение отдельно.

use strict;
use warnings;

my %data;
while (<>) {
    # skip blank lines
    next unless /\S/;

    my ($tag) = /^<(.*)>$/
        or warn("expected tag, got $_ "), next;
    $data{$tag} ||= [];

    while (<>) {
        last if /^<\/\Q$tag\E>$/;

        my (undef, $value) = /^<val(\d+)>(.*)<\/val\1>$/
            or warn("expected val, got $_ "), next;
        push @{ $data{$tag} }, $value;
    }
}

use Data::Dumper;
print Dumper \%data;
...