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"; 
       } 
      } 
     } 
    } 
} 
+0

POST编辑,更好的编码风格,更短,更高效。 –

而不是XML::Parser,我建议你考虑使用XML::LibXML来代替,然后使用XPath表示法来查找XML中的特定元素(通过findnodes()方法)。这样做可以让你获得XML文档中的特定节点,而不需要完全理解其完整结构(或者依赖于以特定方式格式化的源XML)。

XML :: LibXML是described here,而您可以在XPath notation here上获得更多信息。

+0

感谢您的回答。我同意XML:LibXML好得多。但是使用XML :: Parser是一种强制。 :( –

+0

另一种可能性是使用'XML :: Twig',它比'XML :: Parser'更易于使用,并且它是纯粹的perl,所以安装或使用它可能比'XML :: LibXML'更容易。 –

+0

I如果底层库不太可用,那么可以理解使用纯粹的perl解决方案的争论......但是,libxml2几乎无处不在;大多数现代Linux发行版都无法运行,而且它的速度很快:D(和超强大) –