Wie erstelle ich ein JSoup-Dokument mit JS?

9

Ich erstelle ein JSoup-Dokument, das zwei <script type="application/javascript">/* .. */</script> -Elemente enthält.

Das Problem: Wenn ich .html() oder .toString() aufruft, wird JSoup mein JavaScript umgehen.

%Vor%

bekommt

%Vor%

Ist es möglich, JSoup so zu konfigurieren, dass <script> Elements beim Escaping ignoriert wird?

Dies ist (im Grunde), wie ich mein jsoup-Dokument erstelle.

%Vor%

Meine aktuelle Problemumgehung besteht darin, einen Platzhalter durch String.replace on .html() zu ersetzen. Aber das ist ein bisschen hacky.

%Vor%     
Brettetete 03.08.2015, 14:29
quelle

2 Antworten

2

Die outerHtmlHead-Methode kann nicht mehr überschrieben werden.

Das ist was ich benutze:

%Vor%     
user3300388 15.12.2015 09:52
quelle
-1

Sie können es nicht deaktivieren. Mit "kann nicht" meine ich nicht so leicht. Sie müßten den Knoten durchqueren / neu implementieren / überschreiben, was zu viel ist, denke ich. Sie können dies tun

%Vor%

Aktualisieren

Zuerst müssen wir den Ort des Problems identifizieren.

TextNode.java

%Vor%

Insbesondere ist das Problem hier

%Vor%

Entitäten.java

%Vor%

Ok, jetzt haben wir das Problem identifiziert, also was ist die Lösung. Nun, hier ist das Problem. Normalerweise würden Sie outerHtmlHead überschreiben (was für jeden Knoten aufgerufen wird, wenn html() oder toString()-calls outerHtml oder outerHtml() aufgerufen wird. Das Problem ist, dass diese Methode Paket privat , so dass es nicht sichtbar ist, um es außerhalb des Pakets zu überschreiben.

Eine einfache Möglichkeit wäre, den Quellcode von Jsoup herunterzuladen und Ihre benutzerdefinierte Klasse in dasselbe Paket aufzunehmen. Eine andere wäre, die Sichtbarkeit dieser beiden zu schützen.

%Vor%

Das Projekt wird in jeder Klasse Kompilierungsfehler haben, die class Node dahingehend erweitern, dass es nicht möglich ist, die Sichtbarkeit einer überschriebenen Methode zu verringern. Ändere die Sichtbarkeit auch in protected . Danach können Sie eine neue Klasse implementieren, die die Klasse TextNode erweitert. So etwas würde genügen, glaube ich

%Vor%

und Ihr Code muss sich entsprechend ändern

%Vor%

Wenn Sie es so lassen, wird der Text durch TextNode dargestellt. Sie müssen explizit angeben, dass der Text von Ihrer benutzerdefinierten Klasse dargestellt werden muss.

Natürlich könntest du tiefer gehen und eine neue Klasse erstellen, die die script Teile auf generische Weise behandelt.

    
alkis 03.08.2015 18:12
quelle

Tags und Links