2016-10-13 27 views
0

我正在測試一些代碼並解析了XML。爲了進行簡單的測試,我請求了/我的本地主機,響應是我的Apache2默認頁面。 到目前爲止,這麼好。Perl-XML :: LibXML:Apache2上的錯誤解析性能默認頁面

響應是XHTML,因此是XML。所以我拿它來解析(〜11K的大小)。

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

它需要大約16秒,直到它完成沒有錯誤。

如果我給它一個其他xml文件,如果需要0時間,它的大小加倍。

所以...爲什麼?

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

編輯

我需要一提的是我刪除了非XML HTTP頭。

所以串

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

開始,以

</html> 

編輯結束

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

+0

你可以分享'$ response'的內容,以便我們可以在我們結束時檢查它嗎? –

+0

它是沒有HTTP頭的Apache2默認頁面的輸出。大小〜11k。我將在我的文章中加入一個tinyupload鏈接。 – chris01

回答

1

一種可能性是,每次解析文檔解析器關閉從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。

+0

的確,這是網絡。我原本沒想到。謝謝! – chris01

+0

要停止通過網絡加載DTD,請將['no_network'](https://metacpan.org/pod/distribution/XML-LibXML/lib/XML/LibXML/Parser.pod#no_network)分析器選項設置爲1 (通常推薦)或['load_ext_dtd'](https://metacpan.org/pod/distribution/XML-LibXML/lib/XML/LibXML/Parser.pod#load_ext_dtd)爲0。 – nwellnhof