2009-08-03 15 views
7

Jestem kompletnym edytorem Perla, ale jestem pewien, że uczenie się Perla będzie łatwiejsze niż ustalenie, jak parsować XML w awk. Chciałbym przeanalizować .sgm pliki z tego zestawu danych:Błąd analizatora przy użyciu modułu Perl XML :: DOM, "odwołanie do niepoprawnego numeru znaku"

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

Jest to zbiór artykułów z 20.000 Reuters Newswire z dziesięć lat temu, a to standardowy zestaw testowy dla niektórych rodzajów przetwarzania tekstu. Aby uprościć moje testowanie perl, chwyciłem pierwsze kilkaset wierszy z pierwszego pliku i wykonałem test.sgm, dopóki mój skrypt nie działał poprawnie. Zaczyna się tak:

<!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,... 

użyłem skryptu perla z http://www.xml.com/pub/a/2001/05/16/perlxml.html jako przykład, a skończyło się na tym, extract.pl:

use XML::DOM; 

my $file = $ARGV[0]; 

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

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

print "\n"; 

i uzyskać ten wynik:

> 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 nie pomaga (najlepsze trafienie wydaje się być stroną, na której występuje ten sam błąd), a mój przyjaciel hackera Perl nadal jest zawieszony w Blackhat w Vegas. Jakieś pomysły, co robię źle, albo jak mogę wyczyścić plik? Zakładam, że zło dzieje się wewnątrz tego tagu "Unknown", którego nawet nie potrzebuję. Naprawdę chcę tylko wyodrębnić tekst z każdego artykułu. Jeśli potrzebujesz więcej informacji, daj mi znać.

Odpowiedz

7

Numeryczne odwołanie do znaku "& # 5;" nie jest legalne w ważnych dokumentach XML. Odsyłam do sekcji 4.1 Character and Entity References w zaleceniu XML:

Znaki odnoszące się do referencji znakowych MUSZĄ pasować do produkcji Char.

Jeśli teraz w link i spojrzeć na production for Char:

Char :: = # x9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# x10000- # x10FFFF]

Widzimy, że istnieje kilka znaków, które nie mogą się pojawiać ani dosłownie, ani jako numeryczne odniesienie do znaków w ważnym dokumencie XML.

To osobliwość; Dzisiaj nauczyłem się czegoś o XML :).

Zobacz tę rozmowę na temat ASCII control characters in XML, aby uzyskać możliwe obejście tego problemu.

+0

No cóż. Wygląda na to, że nie robię nic złego. Ponieważ nie tworzę pliku XML ani nie używam niepoprawnych znaków do niczego użytecznego, prosty ""// #/bad/g " cleantest.sgm Wygląda na to, że trzeba. Cóż, wciąż narzeka na "śmieci po elementach dokumentu na linii 72", ale to nie ma związku. Dziękujemy za wyśledzenie dla mnie tego archiwum XML. – PlexLuthor

Powiązane problemy