2010-12-21 2 views
0

그래서 하나의 XML 파일을 가져 와서 다른 파일로 다시 구문 분석하는 파서 루틴을 작성했습니다. 이 코드는 나중에 큰 xml 파일을 많은 작은 xml 파일로 분할하도록 수정했습니다.eXML-PARSER 출력에 원하지 않는 해시 참조가 포함되어 있습니다

출력에 문제가 있습니다. 파싱은 잘 작동합니다. 출력에는 해시 (0x19f9b58)와 같은 원치 않는 문자열도 포함됩니다. 왜 그런지 잘 모르겠습니다.

use Encode; 
    use XML::Parser; 
    my $parser = XML::Parser->new(Handlers => {Start => \&handle_elem_start, 
End => \&handle_elem_end,Char => \&handle_char_data,}); 
    my $record; 
    my $file = shift @ARGV; 

    if($file) {$parser->parsefile($file);} 
    exit; 

    sub handle_elem_start 
    { 
     my($expat, $name, %atts) = @_; 

     if ($name eq 'articles'){$file="_data.xml";unlink($file);} 
     $record .= "<"; 
     $record .= "$name"; 
     foreach my $key (keys %atts){$record .= " $key=\"$atts{$key}\"";} 
     $record .= ">"; 
    } 
    sub handle_char_data 
    { 
     my($expat, $text) = @_; 
     $text = decode_utf8($text); 
     $record .= "$text"; 
    } 
    sub handle_elem_end 
    { 
     my($expat, $name) = @_; 
     $record .= "</$name>"; 
     if($name eq 'article') 
     { 
      open (MYFILE, '>>'.$file); 
      print MYFILE $record; 
      close (MYFILE); 
      print $record; 
      $record = {}; 
     } 
     return unless($name eq 'article'); 
    } 

샘플 출력 :

... 
</article>HASH(0x19f9b40) 
<article doi="10.1103/PhysRevSeriesI.9.304"> 
<journal short="Phys. Rev. (Series I)" jcode="PRI">Physical Review (Series I)</journal> 
<volume>9</volume> 
<issue printdate="1899-11-00">5</issue> 
<fpage>304</fpage> 
<lpage>309</lpage> 
<seqno>1</seqno> 
<price></price><tocsec>Articles</tocsec> 
<arttype type="article"></arttype><doi>10.1103/PhysRevSeriesI.9.304</doi> 
<title>An Investigation of the Magnetic Qualities of Building Brick</title> 
<authgrp> 
<author><givenname>O.</givenname><middlename>A.</middlename><surname>Gage</surname></author> 
<author><givenname>H.</givenname><middlename>E.</middlename><surname>Lawrence</surname></author> 
</authgrp> 
<cpyrt> 
<cpyrtdate date="1899"></cpyrtdate><cpyrtholder>The American Physical Society</cpyrtholder> 
</cpyrt> 
</article>HASH(0x19f9b58) 
... 

HASH 문자열이 원하는되지 않습니다, 알려 주시기 바랍니다.

+0

또한이 작업을 수행하기 위해 다른 모듈을 선택하라는 제안을하지 마십시오. – nebulus

+0

적어도 실제 XML 파서를 사용하고 있습니다. [XML :: Writer] (http://search.cpan.org/perldoc?XML::Writer)와 같은 유효한 XML을 작성하는 데 도움이되는 모듈을 사용할 수도 있습니다. – cjm

답변

2
$record = {}; 

$record은 빈 해시에 대한 참조를 포함하도록 설정합니다. 그러나 다른 곳에서는 $record을 문자열로 처리하고 추가합니다. hashref를 문자열로 처리하면 HASH(0x19f9b58)과 같은 문자열이 생깁니다 (수는 다양합니다).

당신은 아마

빈 문자열 (단지 alternate quotes 사용) $record을 설정
$record = q{}; 

을 의미했다.

+0

고마워, 좋은 발견! – nebulus

관련 문제