Wie kann ich eine HTML-org.w3c.dom.Dokument?
Den Dokumentation der Document
interface beschreibt die Schnittstelle als:
Dokument-Schnittstelle stellt die gesamte HTML-oder XML-Dokument.
javax.xml.parsers.DocumentBuilder
baut XML - Document
s. Allerdings bin ich nicht in der Lage, einen Weg zu finden, um zu bauen ein Document
dass ist eine HTML -Document
!
Ich möchte eine HTML - Document
weil ich versucht bin, um ein Dokument zu erstellen, dass ich dann an einer Bibliothek erwartet wird eine HTML -Document
. Diese Bibliothek verwendet Document#getElementsByTagName(String tagname)
in eine nicht case-sensitive Art und Weise, und das ist gut für HTML, aber nicht für XML.
Ich habe umgeschaut, und bin nicht etwas zu finden. Elemente wie Wie konvertieren einer Html-Quelle einer Webseite in org.w3c.dom.Dokument in java? nicht wirklich eine Antwort.
- Sie haben den XMLSerializer zur Verfügung. xerces.apache.org/xerces-j/apiDocs/org/apache/xml/serialize/...
- Ich denke, dass das, was ich suchte, war xerces.apache.org/xerces-j/apiDocs/org/apache/html/dom/.... Noch nicht sicher, obwohl.
- Das dachte ich auch zuerst, aber nicht so viel jetzt. Ich werde versuchen, zu schreiben, eine Antwort, später zu erklären, warum und eine mögliche alternative.
- Ich stellte eine Antwort auf das, was ich gefunden habe bisher. Wenn ich herausgefunden habe, mehr oder Korrekturen, die ich Bearbeiten meine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheinen Sie zwei explizite Anforderungen:
org.w3c.dom.Document
.Document#getElementsByTagName(String tagname)
für den Betrieb in einer case-insensitive Weise.Wenn Sie versuchen, die Arbeit mit HTML
org.w3c.dom.Document
, dann nehme ich an, Sie arbeiten mit irgendeiner Version von XHTML. Weil eine XML-API wie DOM, noch zu erwarten, dass wohlgeformtes XML. HTML ist nicht unbedingt wohlgeformtes XML, aber XHTML ist wohlgeformtes XML. Auch wenn Sie die Arbeit mit HTML, würden Sie haben zu tun, einige vor-Verarbeitung, um sicherzustellen, es ist well-formed XML, bevor Sie versuchen, führen Sie es durch einen XML-parser. Vielleicht ist es einfach einfacher zu Parsen der HTML-zunächst mit einem HTML-parser, wie jsoup, und dann bauen Sie Ihreorg.w3c.dom.Document
zu Fuß durch den HTML-parser produziert, Baum (org.jsoup.nodes.Document
im Fall von jsoup).Es ist ein
org.w3c.dom.html-Code.HTMLDocument
- Schnittstelle, die sichorg.w3c.dom.Document
. Die einzige Implementierung, die ich fand, war in Xerces-j (2.11.0) in form von org.apache.html-Code.dom.HTMLDocumentImpl. Am Anfang scheint vielversprechend, doch bei näherer Untersuchung finden wir, dass es einige Probleme.1. Es ist nicht eine klare, "saubere" Weg, um eine Instanz eines Objekts der Umsetzung der
org.w3c.dom.html.HTMLDocument
- Schnittstelle.Mit Xerces würden wir normalerweise erhalten Sie eine
Document
Objekt mit einemDocumentBuilder
in der folgenden Weise:Oder mit einem
DOMImplementation
Vielfalt:In beiden Fällen sind wir rein mit
org.w3c.dom.*
Schnittstellen zu erhalten, dieDocument
Objekt.Nächste Variante fand ich für
HTMLDocument
war so etwas wie dieses:Dies erfordert von uns direkt instanziieren interne Implementierung der Klassen ist, dass uns die Umsetzung abhängig von Xerces.
(Anmerkung: ich sah auch Xerces hatte auch eine interne
HTMLBuilder
(die setzt das veraltetDocumentHandler
), die angeblich generiert einHTMLDocument using a SAX parser, but I didn't bother looking into it.
)2.
org.w3c.dom.html.HTMLDocument
generiert keine korrekten XHTML.Obwohl, können Sie suchen, die
HTMLDocument
Baum mitgetElementsByTagName(String tagname)
in einer case-insensitive Weise, die alle den Namen der Elemente werden intern gespeichert in ALLE CAPS. Aber XHTML-Elemente und Attribut-Namen sind eigentlich in alle Kleinbuchstaben. (Dies könnte umgangen werden, indem Sie zu Fuß das gesamte Dokument Baum und mitDocument
'srenameNode()
Methode zu ändern, das element, das die Namen in Kleinbuchstaben um.)Außerdem ein XHTML-Dokument sollte an einem geeigneten DOCTYPE-Deklaration und xmlns-Deklaration für den XHTML-Namensraum . Es scheint nicht, eine einfache Möglichkeit, um diese in einem
HTMLDocument
(es sei denn, Sie tun etwas Gefummel mit internen Xerces-Implementierungen).3.
org.w3c.dom.html.HTMLDocument
hat wenig Dokumentation und Xerces-Implementierung der Schnittstelle scheint unvollständig.Ich nicht durchforsten das gesamte Internet, sondern nur die Unterlagen, die ich gefunden für
HTMLDocument
wurde die zuvor im Zusammenhang mit JavaDocs und Kommentare in den source-code der Xerces internen Umsetzung. In den Kommentaren fand ich auch Hinweise, dass verschiedene Teile der Schnittstelle nicht implementiert. (Sidenote: ich habe wirklich den Eindruck, dass dieorg.w3c.dom.html.HTMLDocument
Schnittstelle selbst ist nicht wirklich von jedem genutzt und vielleicht ist selbst unvollständig.)Aus diesen Gründen, ich denke, es ist besser, zu vermeiden
org.w3c.dom.html.HTMLDocument
und nur das tun, was wir können mitorg.w3c.dom.Document
. Was können wir tun?Sowie ein Ansatz ist zu erweitern
org.apache.xerces.dom.DocumentImpl
(die sichorg.apache.xerces.dom.CoreDocumentImpl
implementiertorg.w3c.dom.Document
). Dieser Ansatz erfordert nicht viel code, aber es immer noch macht uns die Umsetzung abhängig von Xerces seit wir erweiternDocumentImpl
. In unseremMyHTMLDocumentImpl
sind wir einfach konvertieren alle tag-Namen in Kleinbuchstaben, die auf der Erstellung des Elements zu suchen. Dies erlaubt die Verwendung vonDocument#getElementsByTagName(String tagname)
in einer case-insensitive Weise.MyHTMLDocumentImpl
:Tester:
Ausgabe:
Anderen ähnlichen Ansatz wie die oben genannten ist stattdessen eine
Document
wrapper umschließt, die eineDocument
- Objekt und implementiert dieDocument
Schnittstelle selbst. Dies erfordert mehr code, als die "VerlängerungDocumentImpl
" - Ansatz, aber dieser Weg ist "sauberer", da wir nicht zu kümmern, insbesondereDocument
Implementierungen. Der zusätzliche code für diesen Ansatz ist nicht schwer; es ist nur ein bisschen mühsam zu bieten all diese wrapper-Implementierungen für dieDocument
Methoden. Ich habe nicht ganz funktionierte das noch und kann es einige Probleme, aber wenn es funktioniert, das ist die Allgemeine Vorstellung:Ob es
org.w3c.dom.html.HTMLDocument
, einer der Ansätze, den ich oben erwähnt habe, oder etwas anderes, vielleicht diese Vorschläge wird dazu beitragen, Ihnen eine Idee, wie Sie Vorgehen.Edit:
In meinem Analyse-tests, während Sie versuchen zu analysieren, die folgende XHTML-Datei, Xerces, würden die nach unten hängen in einem entity-management-Klasse zu öffnen versucht, eine http-Verbindung. Warum weiß ich nicht? Vor allem, da ich getestet habe auf einer lokalen html-Datei mit keine Entitäten. (Vielleicht etwas zu tun mit dem DOCTYPE oder namespace?) Dies ist das Dokument:
org.jsoup.nodes.Document
. Dann war ich der Umwandlung in einorg.w3c.dom.Document
Fuß der Knoten und der jsoupDocument
und erstellen Analog Knoten eines xerces 2HTMLDocumentImplementation
. Trotzdem, es war zu widerwärtig für mich in diesem moment, und ich noch nie getestet, ob es funktioniert hat in Bezug auf die groß-und Kleinschreibung Abfragen :). Danke für deine Antwort! Wirklich zu schätzen.MyHTMLDocumentImpl.createFrom(Document doc)
tatsächlich scheint zu funktionieren ok. Aber der Xerces DOM-parser scheint zu hängen, parsing-Beispiel XHTML-Datei.