it-swarm.com.de

Ungültige Zeichen in XML

Ich arbeite im Moment mit etwas XML.

Ich habe Knoten, die Strings wie folgt enthalten:

<node>This is a string</node>

Einige der Zeichenfolgen, die ich an die Knoten weitergebe, enthalten Zeichen wie &, #, $ usw.

<node>This is a string & so is this</node>

Dies gilt nicht aufgrund der &

Ich kann diese Zeichenfolgen nicht in CDATA einschließen, da sie so sein müssen, wie sie sind. Ich habe versucht, online nach einer Liste von Zeichen zu suchen, die nicht in XML-Knoten eingefügt werden können, ohne in einem CDATA zu sein.

Könnte mir jemand eine Richtung zeigen oder mir eine Liste illegaler Charaktere geben?

188
RailsSon

Die einzigen unzulässigen Zeichen sind &, < und > (sowie " oder ' in Attributen).

Sie werden mit XML-Entitäten geschützt, in diesem Fall möchten Sie &amp; für &.

Eigentlich sollten Sie jedoch ein Tool oder eine Bibliothek verwenden, die XML für Sie schreibt und diese Art von Daten für Sie wegfiltert, damit Sie sich nicht darum kümmern müssen.

127
Welbog

OK, trennen wir die Frage nach (1) den Zeichen, die in einem XML-Dokument überhaupt nicht gültig sind, und (2) den Zeichen, die mit Escapezeichen versehen werden müssen:

Die Antwort von @dolmen 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:

[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

Grundsätzlich sind die Steuerzeichen und Zeichen außerhalb der Unicode-Bereiche nicht zulässig. Dies bedeutet auch, dass das Aufrufen beispielsweise der Zeichenentität &#x3; verboten ist.

1.2. In XML 1.1

Die globale Liste der zulässigen Zeichen lautet:

[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]

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 ...

Die Verwendung von Steuerzeichen und undefiniertem Unicode-Zeichen wird jedoch empfohlen.

Es kann auch bemerkt 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):

Der < muss mit einer &lt;-Entität maskiert werden, da angenommen wird, dass er der Beginn eines Tags ist.

Der & muss mit einer &amp;-Entität maskiert werden, da davon ausgegangen wird, dass er der Beginn einer Entitätsreferenz ist

Der > sollte mit &gt;-Entität maskiert werden. Es ist nicht obligatorisch - es hängt vom Kontext ab - es wird jedoch dringend empfohlen, es zu umgehen.

Der ' sollte mit einer &apos;-Entität versehen werden - obligatorisch in Attributen, die in einfachen Anführungszeichen definiert sind. Es wird jedoch dringend empfohlen, dies stets zu vermeiden.

Der " sollte mit einer &quot;-Entität versehen werden - obligatorisch in Attributen, die in doppelten Anführungszeichen definiert sind. Es wird jedoch dringend empfohlen, dies stets zu vermeiden.

174
potame

Die Liste der gültigen Zeichen befindet sich in der XML-Spezifikation :

Char       ::=      #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]  /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
168
dolmen

Dies ist ein C # -Code, um die ungültigen XML-Zeichen aus einer Zeichenfolge zu entfernen und eine neue gültige Zeichenfolge zurückzugeben.

public static string CleanInvalidXmlChars(string text) 
{ 
    // From xml spec valid chars: 
    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]     
    // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. 
    string re = @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]"; 
    return Regex.Replace(text, re, ""); 
}
55
mathifonseca

Die vordeklarierten Zeichen sind:

& < > " '

http://xml.silmaril.ie/specials.html

17
cgp

Eine weitere einfache Möglichkeit, potenziell unerwünschte XML/XHTML-Zeichen in C # zu umgehen, ist:

WebUtility.HtmlEncode(stringWithStrangeChars)
7
tiands

Zusätzlich zur Antwort von potame, wenn Sie einen CDATA-Block verwenden möchten.

Wenn Sie Ihren Text in einen CDATA-Block einfügen, müssen Sie keine Escapezeichen ..__ verwenden. In diesem Fall können Sie alle Zeichen im folgenden Bereich verwenden:

 graphical representation of possible characters

Hinweis: Darüber hinaus dürfen Sie keine ]]>-Zeichenfolge verwenden. Weil es mit dem Ende des CDATA-Blocks übereinstimmen würde.

Wenn immer noch ungültige Zeichen (z. B. Steuerzeichen) vorhanden sind, ist es wahrscheinlich besser, eine Art Codierung zu verwenden (z. B. base64).

4
bvdb

Diese Antwort hat für mich funktioniert

string code = Regex.Replace(item.Code, @"[\u0000-\u0008,\u000B,\u000C,\u000E-\u001F]", "");

Details in diesem Link zum Blog

2
Kalpesh Popat

Eine andere Methode zum Entfernen falscher XML-Zeichen in C # mithilfe der XmlConvert.IsXmlChar-Methode (Verfügbar seit .NET Framework 4.0)

public static string RemoveInvalidXmlChars(string content)
{
   return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray());
}

sie können auch prüfen, ob alle Zeichen XML-gültig sind.

public static bool CheckValidXmlChars(string content)
{
   return content.All(ch => System.Xml.XmlConvert.IsXmlChar(ch));
}

.Net Fiddle - https://dotnetfiddle.net/v1TNus

Beispielsweise ist das Symbol für vertikale Registerkarten (\ v) für XML nicht gültig, es ist zwar UTF-8-gültig, aber nicht gültig für XML 1.0, und selbst viele Bibliotheken (einschließlich libxml2) vermissen es und geben automatisch ungültiges XML aus.

2
Alex Vazhev

In Woodstox XML-Prozessor werden ungültige Zeichen durch diesen Code klassifiziert

if (c == 0) {
    throw new IOException("Invalid null character in text to output");
}
if (c < ' ' || (c >= 0x7F && c <= 0x9F)) {
    String msg = "Invalid white space character (0x" + Integer.toHexString(c) + ") in text to output";
    if (mXml11) {
        msg += " (can only be output using character entity)";
    }
    throw new IOException(msg);
}
if (c > 0x10FFFF) {
    throw new IOException("Illegal unicode character point (0x" + Integer.toHexString(c) + ") to output; max is 0x10FFFF as per RFC");
}
/*
 * Surrogate pair in non-quotable (not text or attribute value) content, and non-unicode encoding (ISO-8859-x,
 * Ascii)?
 */
if (c >= SURR1_FIRST && c <= SURR2_LAST) {
    throw new IOException("Illegal surrogate pair -- can only be output via character entities, which are not allowed in this content");
}
throw new IOException("Invalid XML character (0x"+Integer.toHexString(c)+") in text to output");

Quelle von hier

1

Für Java-Folks verfügt Apache über eine Dienstprogrammklasse (StringEscapeUtils), die über die Hilfemethode escapeXml verfügt, mit der Zeichen in einer Zeichenfolge mit XML-Entities maskiert werden können.

1
A Null Pointer

Zusammenfassend sind gültige Zeichen im Text:

  • tab, Zeilenvorschub und Wagenrücklauf;
  • alle Nichtsteuerzeichen sind gültig außer & und <;
  • > ist nicht gültig, wenn Folgendes]].

Die Abschnitte 2.2 und 2.4 der XML-Spezifikation geben die Antwort im Detail:

Zeichen

Zulässige Zeichen sind Tabulatorzeichen, Wagenrücklauf, Zeilenvorschub und die zulässigen Zeichen von Unicode und ISO/IEC 10646

Zeichendaten

Das kaufmännische Und-Zeichen (&) und die linke spitze Klammer (<) dürfen nicht .__ sein. erscheinen in ihrer wörtlichen Form, außer wenn sie als Markup-Trennzeichen verwendet werden. oder innerhalb eines Kommentars, einer Verarbeitungsanweisung oder eines CDATA-Abschnitts. Ob Sie werden an anderer Stelle benötigt, sie müssen mit einer der folgenden numerischen Zeichen versehen werden Zeichenreferenzen oder die Zeichenfolgen "&" und "<" beziehungsweise. Die rechtwinklige Klammer (>) kann mit der .__ dargestellt werden. Zeichenfolge ">" und muss aus Kompatibilitätsgründen mit einem der Zeichen.. ">" oder eine Zeichenreferenz, wenn sie in der Zeichenfolge "]]> " im Inhalt angezeigt wird, wenn diese Zeichenfolge nicht das Ende einer CDATA markiert. Sektion.

0
rghome
ampersand (&) is escaped to &amp;

double quotes (") are escaped to &quot;

single quotes (') are escaped to &apos; 

less than (<) is escaped to &lt; 

greater than (>) is escaped to &gt;

Verwenden Sie in C # System.Security.SecurityElement.Escape oder System.Net.WebUtility.HtmlEncode, um diese unzulässigen Zeichen zu entgehen.

string xml = "<node>it's my \"node\" & i like it 0x12 x09 x0A  0x09 0x0A <node>";
string encodedXml1 = System.Security.SecurityElement.Escape(xml);
string encodedXml2= System.Net.WebUtility.HtmlEncode(xml);


encodedXml1
"&lt;node&gt;it&apos;s my &quot;node&quot; &amp; i like it 0x12 x09 x0A  0x09 0x0A &lt;node&gt;"

encodedXml2
"&lt;node&gt;it&#39;s my &quot;node&quot; &amp; i like it 0x12 x09 x0A  0x09 0x0A &lt;node&gt;"
0
live-love

Jeder hat dies System.Security.SecurityElement.Escape(yourstring)? .__ ausprobiert. Dies ersetzt ungültige XML-Zeichen in einer Zeichenfolge durch ihre gültigen Entsprechungen

0
klaydze