2013-11-04 4 views
2

XML::Parser Perl 모듈을 사용하여 구문 분석하는 XML 파일이 있습니다. 구문 분석 XML에 대한 코드 : print Dumper($my_map->[1]) 문의Perl XML 파서

.......................................... 
$parser = XML::Parser->new(Style => 'Tree'); 
$my_map = $parser->parse($xml); 
print Dumper($my_map->[1]) . "\n"; 

결과 :

$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.'을 효율적으로 가져 오려면 어떻게해야합니까?

답변

3

보십시오,이 일을 각 ARRAY 레벨을 반복 : 대답에 대한

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가 더 좋고 코딩 스타일이 더 짧고 효율적으로 편집되었습니다. –

3

XML::Parser 대신 XML::LibXML을 사용하고 XML의 특정 요소를 찾으려면 XPath 표기법을 사용하는 것이 좋습니다 (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 기본 라이브러리가 사용 가능하지 않다면 pure-perl 솔루션 사용에 대한 논쟁을 인정할 수 있지만 libxml2는 사실상 유비쿼터스이며 대부분의 현대 리눅스 배포판은 그 기능 없이는 작동 할 수 없다. 게다가 그것은 매우 사악하다 : D (슈퍼 강력) –