2009-08-03 4 views
7

나는 완전한 Perl newb이지만 Perl을 배우는 것이 awk에서 XML을 구문 분석하는 방법을 찾는 것보다 쉽다는 것을 확신합니다. 나는이 데이터 세트에서 .sgm 파일을 구문 분석하고 싶습니다 :Perl XML :: DOM 모듈, "잘못된 문자 번호에 대한 참조"를 사용하는 파서 오류

http://kdd.ics.uci.edu/databases/reuters21578/reuters21578.html

이것은 10 년 전에서 뉴스 와이어에서 20,000 로이터 기사의 모음입니다, 및 텍스트 처리의 특정 유형의 표준 테스트 세트입니다. 필자의 펄 테스트를 단순화하기 위해 첫 번째 파일에서 처음 몇백 줄을 뽑아 내 스크립트가 제대로 작동 할 때까지 test.sgm을 만들었다. 그것은이처럼 시작합니다

use XML::DOM; 

my $file = $ARGV[0]; 

my $parser = XML::DOM::Parser->new(); 
my $doc = $parser->parsefile($file); 

#print $doc->getElementsByTagName('DATE'); 

print "\n"; 

내가이 출력 얻을 :

을 내가 예를 들어 http://www.xml.com/pub/a/2001/05/16/perlxml.html에서 펄 스크립트를 사용,이, extract.pl에 결국
<!DOCTYPE lewis SYSTEM "lewis.dtd"> 
<REUTERS TOPICS="YES" LEWISSPLIT="TRAIN" CGISPLIT="TRAINING-SET" OLDID="5544" NEWID="1"> 
<DATE>26-FEB-1987 15:01:01.79</DATE> 
<TOPICS><D>cocoa</D></TOPICS> 
<PLACES><D>el-salvador</D><D>usa</D><D>uruguay</D></PLACES> 
<PEOPLE></PEOPLE> 
<ORGS></ORGS> 
<EXCHANGES></EXCHANGES> 
<COMPANIES></COMPANIES> 
<UNKNOWN> 
&#5;&#5;&#5;C T 
&#22;&#22;&#1;f0704&#31;reute 
u f BC-BAHIA-COCOA-REVIEW 02-26 0105</UNKNOWN> 
<TEXT>&#2; 
<TITLE>BAHIA COCOA REVIEW</TITLE> 
<DATELINE> SALVADOR, Feb 26 - </DATELINE><BODY>Showers continued throughout the week in 
the Bahia cocoa zone, alleviating the drought since early 
January and improving prospects for the coming temporao,... 

> perl extract.pl test.sgm 

reference to invalid character number at line 11, column 0, byte 343 at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/XML/Parser.pm line 187 
> 

Google은 도움이되지 않습니다 (인기 히트는 내가 저와 같은 오류가있는 페이지로 보입니다). 그리고 내 Perl 해커 친구는 여전히 Vegas의 Blackhat에서 매달려 있습니다. 내가 뭘 잘못했는지, 또는 파일을 어떻게 정리할 수 있니? 나는 그 "불명 한"꼬리표 안에 나쁜 일이 일어나고 있다고 생각하는데, 나는 그것도 필요치 않습니다. 나는 단지 모든 기사에서 텍스트를 추출하고 싶다. 더 많은 정보가 필요하시면 알려주십시오.

답변

7

숫자 참조 "& # 5;" 유효한 XML 문서에서는 유효하지 않습니다. 4.1 Character and Entity References 섹션의 XML 권장 사항을 참조하십시오.

문자 참조를 사용하여 참조 된 문자는 Char의 프로덕션과 일치해야합니다.

이제 우리가 링크를 따라 볼 경우 production for Char :

숯불 :: = # X9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# x10000- # x10FFFF]

유효한 XML 문서에서 글자 그대로 또는 숫자로 된 문자 참조가 아닌 문자가 있음을 알 수 있습니다.

이상한 점; 나는 오늘 XML에 대해 뭔가를 배웠다. :)

가능한 해결 방법은 ASCII control characters in XML에 대한 대화를 참조하십시오.

+0

그럼. 나는 틀린 아무것도하지 않는 것처럼 보입니다. XML을 만들거나 유용하지 않은 문자를 사용하지 않으므로 간단합니다. sed "s/& #/bad/g" cleantest.sgm 트릭을 수행하는 것 같습니다. 글쎄, 여전히 72 행의 문서 요소 뒤에 나오는 쓰레기에 대해서는 불평하고 있지만 관련이 없습니다. XML 보관 파일을 추적 해 주셔서 감사합니다. – PlexLuthor