부모

2016-10-07 3 views
0

의 속성을 기반으로 XML 하위 요소의 텍스트 내용을 얻을하는 방법이 내가의 name 속성에 따라 각 <project> 요소의 텍스트 내용을 얻을 필요가 내 XML 데이터 부모

<categories> 
    <category id="Id001" name="Abcd"> 
     <project> ID_1234</project> 
     <project> ID_5678</project> 
    </category> 
    <category id="Id002" name="efgh"> 
     <project> ID_6756</project> 
     <project> ID_4356</project> 
    </category> 
</categories> 

입니다 포함하는 <category> 요소.

나는 XML::LibXML 모듈이있는 Perl을 사용하고 있습니다.

예를 들어 주어진 카테고리 이름이 Abcd 인 경우 ID_1234, ID_5678이 표시됩니다.

다음은이 배열 @catn 나에게 카테고리 이름을 제공합니다 내 코드

my $parser = XML::LibXML->new; 

$doc = $parser->parse_file("/cctest/categories.xml"); 

my @nodes = $doc->findnodes('/categories/category'); 

foreach my $cat (@nodes) { 
    my @catn = $cat->findvalue('@name'); 
} 

입니다. 그러나 각 프로젝트의 텍스트 값을 어떻게 얻을 수 있습니까?

+2

어떤 파서를 사용하고 있습니까? – simbabque

+0

안녕하세요, XML :: LibXML을 사용하여 XML 파일을 구문 분석하고 있습니다. – Ras

+0

그리고 어떤 결과물을 찾으십니까? 그리고 코드 현명한 것은 무엇입니까? – Sobrique

답변

0

이 이미 사용하고있는 라이브러리 XML :: LibXML을 사용합니다.

귀하의 $cat 변수를 사용하면 최상위 $doc 객체에 사용되는 것과 동일한 findnodes()findvalue() 방법으로 처리 할 수있는 XML 요소 개체가 포함되어 있습니다.

#!/usr/bin/perl 

use strict; 
use warnings; 
# We use modern Perl here (specifically say()) 
use 5.010; 

use XML::LibXML; 

my $doc = XML::LibXML->new->parse_file('categories.xml'); 

foreach my $cat ($doc->findnodes('//category')) { 
    say $cat->findvalue('@name'); 
    foreach my $proj ($cat->findnodes('project')) { 
    say $proj->findvalue('.'); 
    } 
} 
+0

@ Dave Cross : 고마워요. 이 코드도 내 요구 사항을 충족하는 데 도움이되었습니다. – Ras

3

당신이 지금까지 시도한 것을 보여주지 않았거나 원하는 결과가 무엇인지 알려주므로 찾고있는 것을 추측했습니다.

XML::Twig으로 당신이 뭔가를 할 수 있습니다 :

#!/usr/bin/env perl 

use strict; 
use warnings; 

use XML::Twig; 

my $twig = XML::Twig -> parse (\*DATA); 

foreach my $project ($twig -> findnodes ('//project')) { 
    print join ",", (map { $project -> parent -> att($_) } qw (id name)), $project -> text,"\n"; 
} 

__DATA__ 
<categories> 
<category id="Id001" name="Abcd"> 
    <project> ID_1234</project> 
    <project> ID_5678</project> 
</category> 
<category id="Id002" name="efgh"> 
    <project> ID_6756</project> 
    <project> ID_4356</project> 
</category> 
</categories> 

생산 어떤 :

Id001,Abcd, ID_1234, 
Id001,Abcd, ID_5678, 
Id002,efgh, ID_6756, 
Id002,efgh, ID_4356, 

그것은 모든 요소 '프로젝트'를 찾을 수 findnodes를 사용하여이 작업을 수행합니다.

그런 다음 부모 (카테고리)에서 'id'및 'name'속성을 추출하여 인쇄하고이 특정 요소의 텍스트와 함께 인쇄하십시오.

xpath은 데이터를 XML에서 선택하기위한 강력한 도구이며,보다 집중된 질문을 통해보다 구체적인 답변을 드릴 수 있습니다. 그래서

은 "ABCD는"당신이 할 수 카테고리 '아래에'모든 프로젝트를 찾고 있다면 :

foreach my $project ($twig -> findnodes ('./category[@name="Abcd"]/project')) { 
    print $project -> text,"\n"; 
} 
+0

안녕하세요, 저는 XML :: Twig를 사용해 보았습니다. 모든 도움 주셔서 감사합니다 :) – Ras

-1

당신은 다음과 같이 될 것입니다 XML::Simple

use strict; 
use warnings; 
use XML::Simple; 
use Data::Dumper 

my $XML_file = 'your XML file'; 
my $XML_data; 
#Get data from your XML file 
open(my $IN, '<:encoding(UTF-8)', $XML_file) or die "cannot open file $XML_file"; 
{ 
    local $/; 
    $XML_data = <$IN>; 
} 
close($IN); 
#Store XML data as hash reference 
my $xmlSimple = XML::Simple->new(KeepRoot => 1); 
my $hash_ref = $xmlSimple->XMLin($XML_data); 
print Dumper $hash_ref; 

해시 참조하여 시도 할 수 있습니다 :

$VAR1 = { 
      'categories' => { 
          'category' => { 
             'efgh' => { 
                'id' => 'Id002', 
                'project' => [ 
                   ' ID_6756', 
                   ' ID_4356' 
                  ] 
               }, 
             'Abcd' => { 
                'id' => 'Id001', 
                'project' => [ 
                   ' ID_1234', 
                   ' ID_5678' 
                  ] 
               } 
             } 
         } 
     }; 

이제 원하는 데이터를 얻으십시오 :

foreach(@{$hash_ref->{'categories'}->{'category'}->{'Abcd'}->{'project'}}){ 
    print "$_\n"; 
} 

결과는 다음과 같습니다

ID_1234 
ID_5678 
+5

당신은 _could_하지만 [단순한 "낙담"] (http://stackoverflow.com/questions/33267765/why-is-xmlsimple-discouraged) – Sobrique

+3

a) 추천 XML :: Simple b) 간접적 인 객체 표기법 ('new XML :: Simple') 사용. –

+0

유용한 정보는 @Dave 및 Sobrique에게 감사드립니다. –

관련 문제