2016-10-13 1 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 

EDIT

Я должен упомянуть, что я удалил не-XML HTTP-заголовок.

Так строка начинается с

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

и заканчивается

</html> 

EDIT

Ссылка: http://s000.tinyupload.com/index.php?file_id=88759644475809123183

+0

Не могли бы вы поделиться содержимым '$ response', чтобы мы могли проверить его на нашем конце? –

+0

Это вывод страницы по умолчанию Apache2 без HTTP-заголовков. Размер ~ 11k. Я поставлю tinyupload-ссылку в свой пост. – chris01

ответ

1

Одна возможность состоит в том, что каждый раз, когда вы разбираете документ синтаксический анализатор не работает загрузка DTD из W3C. Вы можете подтвердить это с помощью 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

Смежные вопросы