-1

我有一个如下所示的 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>

任何人都可以帮助我..我很挣扎

谢谢

森蒂尔·库马尔

4

2 回答 2

2

自从我们回到 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 解析器?”)

于 2010-08-24T18:01:51.967 回答
1

假设您的输入是完全正常的,如您所见,以下应该有效。但是,让真正的 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;
于 2010-08-24T15:00:21.433 回答