Парсер Xerces DOM невероятно медленный? - PullRequest
3 голосов
/ 31 октября 2011

В настоящее время я пытаюсь очистить HTML-файл с помощью JTidy, преобразовать его в XHTML и предоставить результаты анализатору DOM.Следующий код является результатом этих усилий:

public class HeaderBasedNewsProvider implements INewsProvider {

    /* ... */

    public Collection<INewsEntry> getNewsEntries() throws NewsUnavailableException {
            Document document;
        try {
            document = getCleanedDocument();
        } catch (Exception e) {
            throw new NewsUnavailableException(e);
        }
        System.err.println(document.getDocumentElement().getTextContent());
        return null;
    }

    private final Document getCleanedDocument() throws IOException, SAXException, ParserConfigurationException {
        InputStream input = inputStreamProvider.getInputStream();
        Tidy tidy = new Tidy();
        tidy.setXHTML(true);
        ByteArrayOutputStream tidyOutputStream = new ByteArrayOutputStream();
        tidy.parse(input, tidyOutputStream);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(false);
        InputStream domInputStream = new ByteArrayInputStream(tidyOutputStream.toByteArray());
        System.err.println(factory.getClass());
        return factory.newDocumentBuilder().parse(domInputStream);
    }
}

Однако реализация синтаксического анализатора DOM (com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl) в моей системе кажется невероятно медленной,Даже для однострочных документов, таких как следующие, синтаксический анализ занимает 2-3 минуты:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title></title></head><body><div class="text"><h2>Nachricht vom 16. Juni 2011</h2><h1>Titel</h1><p>Mitteilung <a href="dokumente/medienmitteilungen/MM_NR_jglp.pdf" target="_blank">weiter</a> mehr Mitteilung</p></div></body></html>

Обратите внимание, что, в отличие от анализатора DOM, JTidy завершает свою работу в течение секунды.Поэтому я подозреваю, что каким-то образом неправильно использую DOM API.

Заранее благодарен за любые предложения по этому вопросу!

Ответы [ 2 ]

7 голосов
/ 31 октября 2011

Даже если не проверять, синтаксический анализатор XML должен извлекать DTD, например, для поддержки именованных символьных сущностей.Вам следует рассмотреть реализацию EntityResolver , которая разрешает запрос DTD в локальную копию.

2 голосов
/ 07 февраля 2013

HTML dtd являются огромными, используя включает. Они берутся навсегда. Используйте XML каталог . Там можно хранить dtds локально и отображать их по системному идентификатору.

Если вы используете такой инструмент, как maven, вы найдете достаточно указателей.

Преимущество i.o. перехват сущностей, как предполагает принятый ответ, заключается в том, что вы получаете правильные символы.

...