Perl XML解析器
我有一个使用XML::Parser
Perl模块解析的XML文件。代码解析XML:Perl XML解析器
..........................................
$parser = XML::Parser->new(Style => 'Tree');
$my_map = $parser->parse($xml);
print Dumper($my_map->[1]) . "\n";
的print Dumper($my_map->[1])
语句的结果:
$VAR1 = [
{},
0,
'
',
'lfs',
[
{
'name' => 'ABC'
},
0,
'
',
'FS',
[
{
'status' => '1',
'acc' => '/tmp',
'kind' => 'ass'
}
],
0,
'
'
],
0,
'
',
'lfs',
[
{
'name' => 'BCG'
},
0,
'
',
'FS',
[
{
'status' => '1',
'acc' => '/home/tmpspace/tmp1',
'kind' => 'oops'
}
],
0,
'
',
'FS',
[
{
'status' => '1',
'acc' => '/home/tmpspace/tmp2',
'kind' => 'hops'
}
],
0,
'
'
],
0,
'
',
'lfs',
[
{
'name' => 'KMN'
},
0,
'
',
'FS',
[
{
'status' => '1',
'acc' => '/misc/ib',
'kind' => 'nops'
}
],
0,
'
'
],
0,
'
',
'lfs',
[
{
'name' => 'MAIN'
},
0,
'
',
'FS',
[
{
'status' => '1',
'acc' => 'This is the string that I wanted.',
'kind' => 'mount'
}
],
0,
'
'
],
0,
'
'
];
从$my_map->[1]
,我希望得到'acc' => 'This is the string that I wanted.'
。如何有效提取'acc' => 'This is the string that I wanted.'
?
尝试这样做,每个迭代阵列级别:
use strict; use warnings;
foreach my $first_level (@$VAR1) {
if(ref $first_level eq "ARRAY") {
foreach my $second_level (@{ $first_level }) {
if(ref $second_level eq "ARRAY") {
foreach my $third_level (@{ $second_level }) {
print $third_level->{acc}, "\n";
}
}
}
}
}
而不是XML::Parser
,我建议你考虑使用XML::LibXML
来代替,然后使用XPath表示法来查找XML中的特定元素(通过findnodes()
方法)。这样做可以让你获得XML文档中的特定节点,而不需要完全理解其完整结构(或者依赖于以特定方式格式化的源XML)。
XML :: LibXML是described here,而您可以在XPath notation here上获得更多信息。
感谢您的回答。我同意XML:LibXML好得多。但是使用XML :: Parser是一种强制。 :( –
另一种可能性是使用'XML :: Twig',它比'XML :: Parser'更易于使用,并且它是纯粹的perl,所以安装或使用它可能比'XML :: LibXML'更容易。 –
I如果底层库不太可用,那么可以理解使用纯粹的perl解决方案的争论......但是,libxml2几乎无处不在;大多数现代Linux发行版都无法运行,而且它的速度很快:D(和超强大) –
POST编辑,更好的编码风格,更短,更高效。 –