xml - online - xpath node
¿Cómo puedo evitar que XML:: XPath obtenga una DTD mientras procesa un archivo XML? (3)
XML :: XPath se basa en XML :: Parser. Existe 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.
Entonces puedes 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 (>, <, &, ''y "). El analizador no se quejará, pero desaparecerán en silencio (intente incluir & alpha en la tabla e imprimir por ejemplo).
Como cuestión 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 de iniciar. Si quieres un módulo basado en expat / XML :: Parser, es posible que desees echar un vistazo a XML :: Twig (eso es auto promoció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 de mi parte), admite XPath.
Mi XML ( a.xhtml ) comienza así
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
...
Mi código comienza así
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 tarda mucho tiempo en obtener la DTD ( http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ).
¿Hay alguna manera de declarar explícitamente un servidor proxy HTTP en la familia Perl XML ::? Odio modificar el documento original a.xhtml como tener una copia local de la DTD.
Por lo general, se hace configurando un catálogo XML local.
Los analizadores basados en libxml lo admiten, por lo que si sigue los consejos de Mirod, podrá obtener entidades con nombre y trabajo de validación sin acceso a la red.
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 simplemente no se da por vencido), y cuando XML :: XPath termina recuperando el conjunto completo de XHTML ...!) Además, la idea de mirod funciona , también:
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 el Catálogo abierto SGML" de <URL: http://www.w3.org/TR/xhtml1/dtds.html > y ¡disfrútelo!