我有一个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>
任何人都可以帮助我..我正在苦苦挣扎
谢谢
Senthil kumar
答案 0 :(得分: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解析器吗?”)
答案 1 :(得分: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;