Xerces DOM解析器非常慢?

时间:2011-10-31 16:40:41

标签: java performance dom xerces

目前,我正在尝试使用JTidy清理HTML文件,将其转换为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 个答案:

答案 0 :(得分:7)

即使未进行验证,XML解析器也需要获取DTD,例如支持命名字符实体。您应该考虑实现一个EntityResolver来解析DTD请求到本地副本。

答案 1 :(得分:2)

HTML dtd非常庞大,使用包含。他们永远。使用XML catalog。可以在本地存储dtd并按系统ID映射它们。

如果你使用像maven这样的工具,你会找到足够多的指针。

优点i.o.如接受的答案所示,拦截实体是你收到正确的字符。