Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止XML::XPath在处理XML文件时获取DTD?_Xml_Perl_Dtd - Fatal编程技术网

如何防止XML::XPath在处理XML文件时获取DTD?

如何防止XML::XPath在处理XML文件时获取DTD?,xml,perl,dtd,Xml,Perl,Dtd,我的XML(a.xhtml)是这样开始的 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ... use XML::XPath; use XML::XPath::XMLParser; my $xp = XML::XPath->new(filename => "a.xht

我的XML(a.xhtml)是这样开始的

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

use XML::XPath::XMLParser;

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

my $nodeset = $xp->find('/html/body//table'); 
它的速度非常慢,而且它花费了大量的时间来获取DTD()


在PerlXML::系列中是否有明确声明HTTP代理服务器的方法?我讨厌修改原始的a.xhtml文档,就像修改DTD的本地副本一样。

通常通过设置本地副本来完成


基于libxml的解析器支持它,因此如果您遵循mirod的建议,您将能够获得命名实体和验证工作,而无需网络访问。

XML::XPath基于XML::Parser。在XML::Parser中有一个选项不使用LWP解析外部实体(如DTD)。XPath允许您传递一个XML::Parser对象,用作解析器

所以你可以这样写:

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

请注意,在这种情况下,您将丢失除数字实体和默认实体之外的所有实体(>,porneL的响应在这里似乎是正确的。(www.w3.org已经开始花30秒来响应我的每个查询(当它不只是放弃时),当XML::XPath最终检索到完整的XHTML集时…!)此外,米罗德的想法也很有效:

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);

从中添加“完整的DTD文件集以及XML声明和SGML开放目录”的副本〈网址:〉 享受吧!

True。您可能可以使用XML::Catalog向XML::Parser对象添加一个目录,并在XML::XPath的新版本中使用该解析器。不过,我从未对此进行过测试。