如何防止XML::XPath在处理XML文件时获取DTD?
我的XML(a.xhtml)是这样开始的如何防止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
<!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的新版本中使用该解析器。不过,我从未对此进行过测试。