Perl - XML::LibXML:Apache2 默认页面上的解析性能不佳

Perl - XML::LibXML: bad parsing performance on Apache2 default page

我正在测试一些代码并包含解析 XML。为了进行简单测试,我请求 / 我的本地主机,响应是我的 Apache2 默认页面。 到目前为止,还不错。

响应是 XHTML,因此 XML。所以我把它用于我的解析(~11k 大小)。

XML::LibXML->load_xml (string => $response);

大约需要 16 秒才能完成且没有错误。

如果我给它另一个 xml-file,如果需要 0 次,尺寸会加倍。

所以...为什么???

Apache/2.4.10
Debian/8.6
XML::LibXML/2.0128

编辑

我需要说明一下,我删除了 non-XML HTTP-header。

所以字符串以

开头
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

并以

结尾
</html>

编辑

Link: http://s000.tinyupload.com/index.php?file_id=88759644475809123183

一种可能是每次您解析文档时,解析器都会从 W3C 下载 DTD。您可以根据您的平台使用 strace 或类似工具来确认这一点。

DTD 包含(除其他事项外)命名实体定义,例如将字符串 &nbsp; 映射到字符 U+00A0。所以为了解析 HTML 文档,解析器确实需要 DTD,但是每次都通过 HTTP 获取它显然不是一个好主意。

一种方法是在本地安装 DTD 的副本并使用它。在 Debian/Ubuntu 系统上,您可以只安装 w3c-dtd-xhtml 软件包,该软件包还会设置适当的 XML 目录条目以允许 libxml 找到它。

另一种方法是使用 XML::LibXML->load_html 而不是 XML::LibXML->load_xml。在 HTML 解析模式下,解析器更能容忍标记错误,我认为也总是使用 DTD 的本地副本。

解析器还提供选项,允许您指定自己的处理程序例程来检索引用 URI。