Ich arbeite mit XML, das Zeichenfolgen enthält wie:
<node>This is a string</node>
Einige der Saiten , dass ich zu den Knoten am Übergang haben Zeichen wie &
, #
, $
, etc .:
<node>This is a string & so is this</node>
Dies gilt nicht wegen &
.
Ich kann diese Zeichenfolgen nicht in CDATA einbinden, da sie so sein müssen, wie sie sind. Ich habe versucht, nach einer Liste von Zeichen zu suchen, die nicht in XML-Knoten eingefügt werden können, ohne sich in einer CDATA zu befinden.
Kann mich jemand in die Richtung eines zeigen oder mir eine Liste illegaler Charaktere geben?
Antworten:
Die einzigen ungültigen Zeichen sind
&
,<
und>
(wie auch"
oder'
in Attribute).Sie werden mithilfe von XML-Entitäten maskiert , in diesem Fall
&
für&
.In Wirklichkeit sollten Sie jedoch ein Tool oder eine Bibliothek verwenden, die XML für Sie schreibt und solche Dinge für Sie abstrahiert, damit Sie sich darüber keine Sorgen machen müssen.
quelle
OK, lassen Sie uns die Frage der Zeichen trennen, die:
Die Antwort von @dolmen in " Was sind ungültige Zeichen in XML ?" Ist weiterhin gültig, muss jedoch mit der XML 1.1-Spezifikation aktualisiert werden.
1. Ungültige Zeichen
Die hier beschriebenen Zeichen sind alle Zeichen, die in ein XML-Dokument eingefügt werden dürfen.
1.1. In XML 1.0
Die globale Liste der zulässigen Zeichen lautet:
Grundsätzlich sind Steuerzeichen und Zeichen außerhalb der Unicode-Bereiche nicht zulässig. Dies bedeutet auch, dass das Aufrufen beispielsweise der Zeichenentität

verboten ist.1.2. In XML 1.1
Die globale Liste der zulässigen Zeichen lautet:
Diese Überarbeitung der XML-Empfehlung hat die zulässigen Zeichen erweitert, sodass Steuerzeichen zulässig sind, und berücksichtigt eine neue Überarbeitung des Unicode-Standards. Diese sind jedoch weiterhin nicht zulässig: NUL (x00) , xFFFE , xFFFF ...
Von der Verwendung von Steuerzeichen und undefinierten Unicode-Zeichen wird jedoch abgeraten.
Es kann auch festgestellt werden, dass dies nicht immer von allen Parsern berücksichtigt wird und XML-Dokumente mit Steuerzeichen möglicherweise abgelehnt werden.
2. Zeichen, die maskiert werden müssen (um ein wohlgeformtes Dokument zu erhalten):
Das
<
muss mit einer<
Entität maskiert werden, da davon ausgegangen wird, dass es der Anfang eines Tags ist.Das
&
muss mit einer&
Entität maskiert werden, da davon ausgegangen wird, dass es der Anfang einer Entitätsreferenz istDas
>
sollte mit>
Entität maskiert werden. Es ist nicht obligatorisch - es hängt vom Kontext ab - aber es wird dringend empfohlen, ihm zu entkommen.Das
'
sollte mit einer'
Entität maskiert werden - obligatorisch in Attributen, die in einfachen Anführungszeichen definiert sind. Es wird jedoch dringend empfohlen, diese immer zu maskieren.Das
"
sollte mit einer"
Entität maskiert werden - obligatorisch in Attributen, die in doppelten Anführungszeichen definiert sind. Es wird jedoch dringend empfohlen, diese immer zu maskieren.quelle
Die Liste der gültigen Zeichen befindet sich in der XML-Spezifikation :
quelle
& < > " '
sind, in bestimmten Kontexten jedoch maskiert werden müssen.Dies ist ein C # -Code zum Entfernen der ungültigen XML-Zeichen aus einer Zeichenfolge und zum Zurückgeben einer neuen gültigen Zeichenfolge.
quelle
\u10000
und\u10FFFF
als einzelne Zeichen, da sie jeweils zwei utf-16-char
Instanzen erfordern , und laut den Dokumenten gibt es möglicherweise nicht mehr als 4 Ziffern.[\u10000-\u10FFFF]
höchstwahrscheinlich als [analysiert wird\u1000
,0-\u10FF
,F
,F
] , das ist seltsam aus , aber legal.Die zuvor deklarierten Zeichen sind:
Weitere Informationen finden Sie unter " Was sind die Sonderzeichen in XML? ".
quelle
Zusätzlich zu Potames Antwort, wenn Sie mit einem CDATA-Block entkommen möchten.
Wenn Sie Ihren Text in einen CDATA-Block einfügen, müssen Sie kein Escapezeichen verwenden . In diesem Fall können Sie alle Zeichen im folgenden Bereich verwenden :
Hinweis: Darüber hinaus dürfen Sie die
]]>
Zeichenfolge nicht verwenden. Weil es mit dem Ende des CDATA-Blocks übereinstimmen würde.Wenn es immer noch ungültige Zeichen gibt (z. B. Steuerzeichen), ist es wahrscheinlich besser, eine Art Codierung zu verwenden (z. B. base64).
quelle
Ein weiterer einfacher Weg, um potenziell unerwünschten XML / XHTML-Zeichen in C # zu entkommen, ist:
quelle
Eine andere Möglichkeit, falsche XML-Zeichen in C # zu entfernen, ist die Verwendung von
XmlConvert.IsXmlChar
(Verfügbar seit .NET Framework 4.0).oder Sie können überprüfen, ob alle Zeichen XML-gültig sind:
.Net Geige
Beispielsweise ist das vertikale Tabulatorsymbol (
\v
) für XML nicht gültig, es ist gültig für UTF-8, aber nicht für XML 1.0, und selbst viele Bibliotheken (einschließlich libxml2) vermissen es und geben stillschweigend ungültiges XML aus.quelle
Zusammenfassend sind gültige Zeichen im Text:
&
und sind gültig<
.>
ist nicht gültig, wenn folgendes]]
.Die Abschnitte 2.2 und 2.4 der XML-Spezifikation geben die Antwort im Detail:
Zeichen
Zeichendaten
quelle
" XmlWriter und niedrigere ASCII-Zeichen " haben bei mir funktioniert
quelle
Verwenden
System.Security.SecurityElement.Escape
oder verwenden SieSystem.Net.WebUtility.HtmlEncode
in C # diese unzulässigen Zeichen.quelle
Für Java-Benutzer verfügt Apache über eine Utility-Klasse (
StringEscapeUtils
) mit einer Hilfsmethode, mitescapeXml
der Zeichen in einer Zeichenfolge mithilfe von XML-Entitäten maskiert werden können.quelle
Im Woodstox-XML-Prozessor werden ungültige Zeichen durch diesen Code klassifiziert:
Quelle von hier
quelle
Hat das jemand versucht
System.Security.SecurityElement.Escape(yourstring)
? Dadurch werden ungültige XML-Zeichen in einer Zeichenfolge durch ihre gültigen Entsprechungen ersetzt.quelle
Für XSL (an wirklich faulen Tagen) verwende ich:
um alle & -Zeichen zu übersetzen, denen nicht gefolgt wird på amp; zu den richtigen.
Wir haben Fälle, in denen die Eingabe in CDATA erfolgt, das System, das das XML verwendet, dies jedoch nicht berücksichtigt. Es ist eine schlampige Lösung, Vorsicht ...
quelle