2010-01-07 2 views
3

출력에서 ​​내 문자열을 두 번 가져 오는 이유는 무엇입니까?왜 XML :: Twig는 추출 된 문자열을 두 번 출력합니까?

#!/usr/bin/perl 
use warnings; 
use strict; 

use XML::Twig; 


my $string = '<cd_catalogue><title>Hello, World!</title></cd_catalogue>'; 

my $t= XML::Twig->new( twig_handlers => { cd_catalogue => \&cd_catalogue, }, 
      pretty_print => 'indented', 
); 

$t->parse($string); 


sub cd_catalogue { 
    my($t, $cd_catalogue) = @_; 
    $cd_catalogue->flush; 
} 


# Output: 
#<cd_catalogue> 
# <title>Hello, World!</title> 
#</cd_catalogue> 
#<cd_catalogue> 
# <title>Hello, World!</title> 
#</cd_catalogue> 

답변

4

당신의 서브 printpurge 대신 flush를 사용하는 변경은 문제를 해결 가져옵니다 cd_catalogue가 루트 노드이기 때문에 flush 때문에 귀하의 예제의 단순성 혼란스러워지고

sub cd_catalogue { 
    my($t, $cd_catalogue) = @_; 
    $cd_catalogue->print; 
    $cd_catalogue->purge; 
} 

.

my $string = ' 
    <cds> 
     <cd_catalogue><title>Hello, World!</title></cd_catalogue> 
    </cds>'; 

을하거나 title 찾기 위해 당신의 twig_handler를 변경 한 경우 : 당신은 이런 식으로 데이터를 변경하는 경우

twig_handlers => { title => \&cd_catalogue } 

는 당신은 당신 $string 예상대로 $cd_catalogue->flush 지금 작동하는 것을 발견 할 것이다.

/I3az/

4

프로그램은 XML :: Twig를 잘못 사용합니다. According to the documentation, "항상 나뭇 가지를 플러시해야합니다. 엘레멘트가 아닙니다."

변경 cd_catalogue

sub cd_catalogue { 
    my($t, $cd_catalogue) = @_; 
    $t->flush; 
} 

에 예상 된 동작을 얻을 수 있습니다.

+0

이상하게도 이것은 내가 원래 대답에 넣었던 것입니다. 그러나 설명서에는 "elements"(http://search.cpan.org/dist/XML-Twig/Twig)가있는 플러시를 사용하는 예가 나와 있습니다. 오후 # Processing_an_XML_document_chunk_by_chunk). – draegtun

+3

예, 요소를 비우면 해당 요소가 플러시되고 문서를 수정합니다. 감사 – mirod

관련 문제