tutorial online node make how attribute xml perl dtd

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!