¿Cómo puedo prevenir XML::XPath de la obtención de una DTD, mientras que el procesamiento de un archivo XML?

StackOverflow https://stackoverflow.com/questions/303510

  •  08-07-2019
  •  | 
  •  

Pregunta

Mi XML (una.xhtml) se inicia como este

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
...

Mi código inicia de esta manera

use XML::XPath;

use XML::XPath::XMLParser;

my $xp = XML::XPath->new(filename => "a.xhtml");

my $nodeset = $xp->find('/html/body//table'); 

Es muy lento, y resulta que se pasa un montón de tiempo para llegar al DTD (http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd).

Es allí una manera de declarar explícitamente un servidor proxy HTTP en el Perl XML::de la familia?Yo odio a modificar el original una.xhtml documento de como tener una copia local de la DTD.

¿Fue útil?

Solución

XML :: XPath se basa en XML :: Parser. Hay una opción en XML :: Parser para NO usar LWP para resolver entidades externas (como DTD). Y XML :: XPath le permite pasar un objeto XML :: Parser, para usar como analizador.

Para que pueda escribir esto:

my $p = XML::Parser->new( NoLWP => 1);
my $xp= XML::XPath->new( parser => $p, filename => "a.xhtml");

Tenga en cuenta que en este caso perderá todas las entidades excepto las numéricas y las predeterminadas (> ;, < ;, & amp ;, 'y "). El analizador no se quejará, pero desaparecerá en silencio (intente incluir & Amp; alpha; en la tabla e imprimirlo, por ejemplo).

De hecho, probablemente no debería usar XML :: XPath, que no se mantiene activamente.

Pruebe XML :: LibXML, si no tiene problemas con la instalación de libxml2, su interfaz es muy similar a XML :: XPath ya que ambos implementan el DOM. XML :: LibXML también es mucho más poderoso que XML :: XPath, y más rápido para arrancar. Si desea un módulo basado en expat / XML :: Parser, es posible que desee echar un vistazo a XML :: Twig (eso es una autopromoción flagrante ya que soy el autor del módulo, lo siento). También para HTML / dodgy XHTML, puede usar HTML :: TreeBuilder, que, con la adición de HTML :: TreeBuilder :: XPath (también para mí), es compatible con XPath.

Otros consejos

La respuesta de

porneL parece ser lo correcto aquí. (www.w3.org ha comenzado a tomar 30 segundos para responder a cada una de mis consultas (cuando no solo se rinde) y cuando XML :: XPath termina recuperando el conjunto XHTML completo & # 8230 ;!) Además, la idea de mirod también funciona:

use XML::XPath;
use XML::Catalog;

my $parser = new XML::Parser;
my $catalog_handler = new XML::Catalog("xhtml1-20020801/DTD/xhtml.soc")->get_handler($parser);
$parser->setHandlers("ExternEnt" => $catalog_handler);
my $xp = new XML::XPath(xml => $xml, parser => $parser);

Agregue una copia de " El conjunto completo de archivos DTD junto con una declaración XML y SGML Open Catalog " de & # 10216; URL: http://www.w3.org/TR/ xhtml1 / dtds.html & # 10217; y disfruta!

Generalmente se hace mediante el establecimiento de locales Catálogo XML.

libxml-basado en los analizadores de apoyo, por lo que si usted sigue mirod del consejo, usted será capaz de obtener de entidades nombradas y validación de trabajo sin acceso a la red.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top