Da HTML-Dateien im Allgemeinen problematisch sind, müssen Sie sie zunächst mit einem Parser/Scanner bereinigen. Ich habe JTidy verwendet, aber nie mit Erfolg. NekoHTML funktioniert ganz gut, aber alle diese Tools sind immer nur eine Vermutung dessen, was beabsichtigt ist. Sie möchten, dass ein Programm das Markup eines Dokuments so lange verändert, bis es mit einem Schema übereinstimmt. Das wird wahrscheinlich zu strukturellen (Auszeichnungs)-, Stil- oder Inhaltsverlusten führen. Das ist unvermeidlich, und Sie werden nicht wirklich wissen, was fehlt, wenn Sie nicht manuell über einen Browser scannen (und dann müssen Sie auch dem Browser vertrauen).
Es hängt wirklich von Ihrem Zweck ab - wenn Sie Tausende von hässlichen Dokumenten mit tonnenweise fremdem (nicht-HTML) Markup haben, dann ist ein manueller Prozess wahrscheinlich unvernünftig. Wenn Ihr Ziel die Genauigkeit bei einigen wenigen wichtigen Dokumenten ist, dann ist die manuelle Korrektur ein vernünftiger Vorschlag.
Ein Ansatz ist der manuelle Prozess des wiederholten Durchlaufs des Quelltextes durch einen wohlgeformten und/oder validierenden Parser in einem Bearbeitungszyklus, wobei die Fehlermeldungen verwendet werden, um das fehlerhafte Markup zu korrigieren. Dies erfordert zwar ein gewisses Maß an XML-Kenntnissen, aber das ist keine schlechte Ausbildung, die man auf sich nehmen sollte.
Mit Java 5 sind die notwendigen XML-Funktionen - JAXP API genannt - nun in Java selbst integriert; Sie benötigen keine externen Bibliotheken.
Sie erhalten zunächst eine Instanz einer DocumentBuilderFactory, legen deren Eigenschaften fest, erstellen einen DocumentBuilder (Parser) und rufen dann dessen parse()-Methode mit einer InputSource auf. InputSource hat eine Reihe von möglichen Konstruktoren, wobei im folgenden Beispiel ein StringReader verwendet wird:
import javax.xml.parsers.*;
// ...
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
dbf.setNamespaceAware(true);
dbf.setIgnoringComments(false);
dbf.setIgnoringElementContentWhitespace(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
return db.parse(new InputSource(new StringReader(source)));
Dies gibt ein DOM-Dokument zurück. Wenn es Ihnen nichts ausmacht, externe Bibliotheken zu verwenden, gibt es auch die JDOM- und XOM-APIs, die zwar einige Vorteile gegenüber den SAX- und DOM-APIs in JAXP haben, aber das Hinzufügen von Nicht-Java-Bibliotheken erfordern. Das DOM kann etwas umständlich sein, aber nachdem ich es so viele Jahre benutzt habe, stört mich das nicht mehr wirklich.