2009-08-03 9 views
7

Soy un completo Perl newb, pero estoy seguro de que aprender Perl será más fácil que averiguar cómo analizar XML en awk. Me gustaría analizar los archivos .sgm de este conjunto de datos:Error del analizador utilizando el módulo Perl XML :: DOM, "referencia al número de carácter no válido"

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

Esta es una colección de 20.000 artículos de Reuters, desde servicio de noticias desde hace una década, y es un conjunto de pruebas estándar para ciertos tipos de procesamiento de texto. Para simplificar mi prueba perl, agarré las primeras cientos líneas del primer archivo e hice test.sgm hasta que mi script funcionó correctamente. Comienza así:

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

he utilizado un script en perl de http://www.xml.com/pub/a/2001/05/16/perlxml.html como un ejemplo, y terminamos con esto, 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"; 

y me da este resultado:

> 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 no ayuda (el hit superior parece ser una página que está experimentando el mismo error que yo) y mi amigo hacker Perl todavía está colgado de Blackhat en Las Vegas. ¿Alguna idea de lo que estoy haciendo mal, o cómo puedo limpiar el archivo? Supongo que la maldad está sucediendo dentro de esa etiqueta "Desconocida", que ni siquiera necesito. Realmente solo quiero extraer el texto de cada artículo. Si necesita más información, por favor hágamelo saber.

Respuesta

7

La referencia de caracteres numéricos "& # 5;" no es legal en documentos XML válidos. Lo remito a la sección 4.1 Character and Entity References en la recomendación de XML:

Los caracteres a los que se hace referencia con referencias de caracteres DEBEN coincidir con la producción de Char.

Ahora bien, si seguimos el enlace y observamos la production for Char:

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

vemos que hay algunos caracteres que no pueden aparecer ni literalmente ni como una referencia de caracteres numéricos en un documento XML válido.

Una rareza que; Aprendí algo sobre XML hoy :).

Consulte esta conversación en ASCII control characters in XML para una posible solución.

+0

Bueno, entonces. Parece que no estoy haciendo nada mal. Como no estoy creando el XML ni estoy usando los caracteres no válidos para nada útil, un simple sed "s/y #/bad/g" cleantest.sgm Parece que lo hace. Bueno, sigue quejándose de "junk tras elemento de documento en la línea 72", pero eso no está relacionado. Gracias por rastrear ese archivo XML por mí. – PlexLuthor

Cuestiones relacionadas