Sehr ähnlich zu dieser Frage , außer Java.
Was ist die empfohlene Methode zum Codieren von Zeichenfolgen für eine XML-Ausgabe in Java? Die Zeichenfolgen können Zeichen wie "&", "<" usw. enthalten.
Sehr ähnlich zu dieser Frage , außer Java.
Was ist die empfohlene Methode zum Codieren von Zeichenfolgen für eine XML-Ausgabe in Java? Die Zeichenfolgen können Zeichen wie "&", "<" usw. enthalten.
Ganz einfach: Verwenden Sie eine XML-Bibliothek. Auf diese Weise ist es tatsächlich richtig, anstatt detaillierte Kenntnisse der Bits der XML-Spezifikation zu erfordern.
Wie bereits erwähnt, ist die Verwendung einer XML-Bibliothek der einfachste Weg. Wenn Sie sich selbst entziehen möchten, können Sie in
StringEscapeUtils
der Apache Commons Lang- Bibliothek nachsehen .quelle
StringEscapeUtils.escapeXml(str)
voncommons-lang
. Ich benutze es in der App Engine-Anwendung - arbeite wie ein Zauber. Hier ist das Java-Dokument für diese Funktion:\t
,\n
und\r
.\t
,\n
oder\r
muss entkommen werden?Benutz einfach.
Dies erlaubt alle Zeichen außer dem Ende
Sie können also unzulässige Zeichen wie & und> einfügen. Beispielsweise.
Attribute müssen jedoch maskiert werden, da CDATA-Blöcke nicht für sie verwendet werden können.
quelle
Dies hat für mich gut funktioniert, um eine maskierte Version einer Textzeichenfolge bereitzustellen:
quelle
Versuche dies:
quelle
t==null
.Diese Frage ist acht Jahre alt und immer noch keine völlig richtige Antwort! Nein, Sie sollten nicht eine vollständige API eines Drittanbieters importieren müssen, um diese einfache Aufgabe auszuführen. Schlechter Rat.
Die folgende Methode wird:
Ich habe versucht, für den häufigsten Fall zu optimieren, während ich trotzdem sicherstellte, dass Sie dies durch / dev / random leiten und eine gültige Zeichenfolge in XML erhalten können.
Bearbeiten: Für diejenigen, die weiterhin darauf bestehen, dass es dumm ist, Ihren eigenen Code dafür zu schreiben, wenn es perfekt gute Java-APIs für den Umgang mit XML gibt, möchten Sie vielleicht wissen, dass die StAX-API in Oracle Java 8 enthalten ist (andere habe ich nicht getestet ) codiert CDATA-Inhalte nicht korrekt: Es entgeht nicht]]> Sequenzen im Inhalt. Eine Drittanbieter-Bibliothek, auch eine, die Teil des Java-Kerns ist, ist nicht immer die beste Option.
quelle
StringEscapeUtils.escapeXml()
entgeht keinen Steuerzeichen (<0x20). XML 1.1 erlaubt Steuerzeichen; XML 1.0 nicht. Beispielsweise,XStream.toXML()
werden die Steuerzeichen eines Java-Objekts gerne in XML serialisiert, was ein XML 1.0-Parser ablehnt.Verwenden Sie, um Steuerzeichen mit Apache commons-lang zu umgehen
quelle
quelle
replaceAll
Anrufen ist sehr ineffizient, insbesondere bei großen Zeichenfolgen. Jeder Aufruf führt dazu, dass ein neues String-Objekt erstellt wird, das so lange herumhängt, bis der Müll gesammelt wird. Außerdem muss bei jedem Aufruf die Zeichenfolge erneut durchlaufen werden. Dies könnte in einer einzigen manuellen Schleife mit Vergleichen mit jedem Zielzeichen in jeder Iteration zusammengefasst werden.Während der Idealismus besagt, dass eine XML-Bibliothek verwendet werden soll, sagt IMHO, wenn Sie eine grundlegende Vorstellung von XML haben, der gesunde Menschenverstand und die Leistung sagen, dass die Vorlage vollständig ist. Es ist wohl auch besser lesbar. Die Verwendung der Escape-Routinen einer Bibliothek ist wahrscheinlich eine gute Idee.
Bedenken Sie: XML wurde von Menschen geschrieben werden soll.
Verwenden Sie Bibliotheken zum Generieren von XML, wenn Sie Ihr XML als "Objekt" haben, um Ihr Problem besser zu modellieren. Zum Beispiel, wenn steckbare Module am Prozess der Erstellung dieses XML beteiligt sind.
Bearbeiten: Wie man XML tatsächlich in Vorlagen maskiert, die Verwendung von CDATA oder
escapeXml(string)
von JSTL sind zwei gute Lösungen,escapeXml(string)
die wie folgt verwendet werden können:quelle
Das Verhalten von StringEscapeUtils.escapeXml () wurde von Commons Lang 2.5 auf 3.0 geändert. Unicode-Zeichen größer als 0x7f werden jetzt nicht mehr ausgeblendet.
Dies ist eine gute Sache. Die alte Methode bestand darin, Entitäten zu entkommen, die einfach in ein utf8-Dokument eingefügt werden konnten.
Die neuen Escaper in Google Guava 11.0 scheinen ebenfalls vielversprechend: http://code.google.com/p/guava-libraries/issues/detail?id=799
quelle
Für diejenigen, die nach der am schnellsten zu schreibenden Lösung suchen: Verwenden Sie Methoden von apache commons-lang :
StringEscapeUtils.escapeXml10()
für xml 1.0StringEscapeUtils.escapeXml11()
für xml 1.1StringEscapeUtils.escapeXml()
ist jetzt veraltet, wurde aber in der Vergangenheit häufig verwendetDenken Sie daran, die Abhängigkeit einzuschließen:
quelle
Hinweis: Bei Ihrer Frage geht es um Escape und nicht um Codierung . Beim Escaping wird <usw. verwendet, damit der Parser zwischen "Dies ist ein XML-Befehl" und "Dies ist Text" unterscheiden kann. Die Codierung wird im XML-Header angegeben (UTF-8, ISO-8859-1 usw.).
Verwenden Sie zunächst, wie alle anderen sagten, eine XML-Bibliothek. XML sieht einfach aus, aber das Codieren + Escape-Material ist dunkles Voodoo (was Sie bemerken werden, sobald Sie auf Umlaute und japanische und andere seltsame Dinge wie " Ziffern voller Breite " stoßen (& # FF11; ist 1)). XML lesbar zu halten, ist eine Aufgabe von Sisyphus.
Ich schlage vor, niemals zu versuchen, klug in Bezug auf Textcodierung und Escape in XML zu sein. Aber lass dich nicht davon abhalten, es zu versuchen. Denken Sie daran, wann es Sie beißt (und es wird).
Wenn Sie jedoch nur UTF-8 verwenden, können Sie diese Strategie in Betracht ziehen, um die Lesbarkeit zu verbessern:
<![CDATA[ ... ]]>
Ich verwende dies in einem SQL-Editor und es ermöglicht den Entwicklern, SQL aus einem SQL-Tool eines Drittanbieters auszuschneiden und in das XML einzufügen, ohne sich Gedanken über das Entkommen machen zu müssen. Dies funktioniert, weil die SQL in unserem Fall keine Umlaute enthalten kann, also bin ich sicher.
quelle
Obwohl ich Jon Skeet im Prinzip zustimme, habe ich manchmal nicht die Möglichkeit, eine externe XML-Bibliothek zu verwenden. Und ich finde es merkwürdig, dass die beiden Funktionen zum Escape / Unscape eines einfachen Werts (Attribut oder Tag, nicht vollständiges Dokument) in den in Java enthaltenen Standard-XML-Bibliotheken nicht verfügbar sind.
Als Ergebnis und basierend auf den verschiedenen Antworten, die ich hier und anderswo gesehen habe, ist hier die Lösung, die ich letztendlich erstellt habe (nichts hat als einfaches Kopieren / Einfügen funktioniert):
Das Obige berücksichtigt verschiedene Dinge:
Irgendwann werde ich die Inversion dieser Funktion in Uncapsed () schreiben. Ich habe heute einfach keine Zeit dafür. Wenn ich das tue, werde ich diese Antwort mit dem Code aktualisieren. :) :)
quelle
Um XML-Zeichen zu entkommen, verwenden Sie am einfachsten das Apache Commons Lang-Projekt, JAR, das heruntergeladen werden kann von: http://commons.apache.org/lang/
Die Klasse lautet wie folgt: org.apache.commons.lang3.StringEscapeUtils;
Es hat eine Methode namens "EscapeXml", die einen entsprechend maskierten String zurückgibt.
quelle
Wenn Sie nach einer Bibliothek suchen, um die Arbeit zu erledigen, versuchen Sie:
Guava 26.0 hier dokumentiert
return XmlEscapers.xmlContentEscaper().escape(text);
Apache Commons Text 1.4 hier dokumentiert
StringEscapeUtils.escapeXml11(text)
quelle
Hier ist eine einfache Lösung, die sich auch hervorragend zum Codieren von Zeichen mit Akzent eignet!
Ausgänge
quelle
Sie können die ESAPI-Bibliothek (Enterprise Security API) verwenden , die Methoden wie
encodeForXML
und bereitstelltencodeForXMLAttribute
. Schauen Sie sich die Dokumentation der Encoder- Schnittstelle an. Es enthält auch Beispiele zum Erstellen einer Instanz von DefaultEncoder .quelle
Einfach ersetzen
Und für andere Charaktere:
quelle
Verwenden Sie JAXP und vergessen Sie die Textverarbeitung, die automatisch für Sie erledigt wird.
quelle
Versuchen Sie, das XML mit dem Apache XML-Serializer zu codieren
quelle
Folgendes habe ich gefunden, nachdem ich überall nach einer Lösung gesucht habe:
Holen Sie sich die Jsoup-Bibliothek:
Dann:
Hoffe das hilft jemandem
quelle