2012-11-16 3 views
0

키로 저장된 모든 xml id가 필요하며 값은 항상 비어 있습니다. 나뭇 가지에 전역 해시로 모든 id 값을 저장하는 방법은 무엇입니까?ID로 전역 해시를 키로 저장

XML :

XML :

<book> 
<book-meta> 
<p><xref id="page_xii"/> to reproduce their work<xref id="fn1"/> in this volume<xref id="fn2"/>.</p> 
</book-meta> 
</book> 

스크립트 : 나는 모든 키와 같은 글로벌 해시 ID를 얻을 수있는 방법

use strict; 
use XML::Twig; 
my $xml_twig_content = XML::Twig->new(
       keep_encoding => 1, 
       twig_handlers => { 
       keep_atts_order => 1, 
       }, 
       pretty_print => 'indented', 
); 

$xml_twig_content->parsefile('sample.xml'); 

나는이 작업을 수행 할 수 없습니다.

내가이 필요합니다

my %global; 
  1. page_xii 나는이 얻을 수있는 방법
  2. 을 Fn1
  3. Fn2를

. 이 유형의 예를 저장하십시오. $ global {page_xii} = '';

+0

나뭇 가지를 게시 할 수 있습니까? 내가 볼 수있는 것은 지금 코드를 초기화하는 것입니다. – Zaid

+0

@Zaid 나는 그가 가지고 있다고 생각하지 않습니다. – simbabque

답변

1

_all_ 요소에 대한 처리기를 추가하여 이와 같은 각 요소의 id을 구문 분석 할 수 있습니다. 자세한 내용은 docs을 참조하십시오. 조금만 검색해야 할 수도 있습니다. 보다 일반적인 노트에


use strict; 
use warnings; 
use XML::Twig; 
my $xml = <<'XML'; 
<book> 
<book-meta> 
<p><xref id="page_xii"/> to reproduce their work<xref id="fn1"/> in this volume<xref id="fn2"/>.</p> 
</book-meta> 
</book> 
XML 

my %global; 
my $xml_twig_content = XML::Twig->new(
    keep_encoding => 1, 
    twig_handlers => { 
    keep_atts_order => 1, 
    '_all_'   => sub {  # this is the important part! 
     my ($twig, $elem) = @_; # second argument is the current element 
     $global{ $elem->id } = ''; # it has a method id() that gets the id 
    }, 
    }, 
    pretty_print => 'indented', 
); 

$xml_twig_content->parse($xml); 
print Dumper \%global; 

, 당신은 당신의 프로그램에 use warnings을 추가해야합니다. 또한, 일반적으로 단지 ''%global의 요소의 값을 설정, 대신 증분 사용하지 않는 게 좋을 :

$global{ $elem->id }++; 
2

그것은 당신이 해시에, 배열 순서대로 탐 필요 여부에 따라 달라집니다 .

해시로 가져 오려면 많이하지 않아도됩니다. $twig->{twig_id_list} (왜 나뭇 가지를 $xml_twig_content이라고 부릅니까? 길고 번거 롭습니다.) API에 의해 보증되지는 않지만 10 년 후에 변경되지는 않으며 다음 10 년에 변경 될 이유가 없습니다.

배열로 가져 오려면 @*[@id]에 핸들러를 설정할 수 있습니다 그 배열에 ID를 누르면됩니다

twig_handlers => { '*[@id]' => sub { push @ids, $_->id; } } 

은 당신이 원하는 것은, 해시 ID => 경우

my %global= map { $_ => $ids[$_] } [email protected]; 

할 그것은 비록 이상한 요구 사항의 종류입니다.

+0

항상 모든 나뭇 가지 질문에 하나 이상의 솔루션이 있다는 것은 놀라운 일입니다. 그것은 Perl 인 것처럼 보입니다. ;-) – simbabque

+0

솔직히 말해서 XML :: Twig는 PHP와 매우 비슷합니다. 길고 때로는 혼란스러운 이름을 가진 많은 메소드가 있지만, 결국에는 끝난 것 같습니다. (PHP, 너). 또한 거의 오랜 기간 동안 (첫 번째, CPAN 이전 버전, 1997 년 버전) – mirod

관련 문제