Actuellement, j'essaie de nettoyer un fichier HTML en utilisant JTidy, le convertir en XHTML et fournir les résultats à un analyseur DOM. Le code suivant est le résultat de ces efforts:Xerces DOM parser incroyablement lent?
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);
}
}
Cependant, l'implémentation de l'analyseur DOM (com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl) sur mon système semble être incroyablement lent. Même pour les documents d'une ligne telles que les suivantes, l'analyse syntaxique prend 2-3 minutes:
<!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>
Notez que - contrairement à l'analyseur DOM - JTidy termine ses travaux dans une seconde. Par conséquent, je soupçonne que je suis en quelque sorte abusant de l'API DOM.
Merci d'avance pour toute suggestion sur celui-ci!
Très étrange. Ça ne devrait pas être aussi lent que ça sur un si petit document. Et puisque vous définissez explicitement la validation sur false, je ne m'attendrais pas à ce qu'il résolve les problèmes de la DTD. Pouvez-vous passer cela à travers un profiler pour savoir quels appels prennent le plus de temps? –