Caratteri non validi in XML

Sto lavorando con alcuni XML al momento.

Ho dei nodes che contengono stringhe come di seguito:

This is a string 

Alcune delle stringhe che sto passando ai nodes avranno caratteri come &, #, $ ecc.

 This is a string & so is this 

Questo non è valido a causa del &

Non posso avvolgere queste stringhe in CDATA in quanto devono essere così come sono. Ho provato a cercare online un elenco di caratteri che non possono essere inseriti nei nodes XML senza essere in un CDATA.

Qualcuno potrebbe indicarmi la direzione di uno o fornirmi una lista di personaggi illegali?

Gli unici caratteri non validi sono & , < e > (così come " o ' negli attributi).

Sono sfuggiti usando entity framework XML , in questo caso vuoi & per & .

In realtà, però, dovresti usare uno strumento o una libreria che scrive XML per te e riassume questo tipo di cose per te in modo da non doverti preoccupare.

L’elenco di caratteri validi si trova nella specifica XML :

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

OK, separiamo la domanda di (1) i caratteri che non sono affatto validi in alcun documento XML, e (2) i caratteri che devono essere sfuggiti:

La risposta fornita da @dolmen Caratteri non validi in XML è ancora valida ma deve essere aggiornata con la specifica XML 1.1.

1. Caratteri non validi

I caratteri qui descritti sono tutti i caratteri che possono essere inseriti in un documento XML.

1.1. In XML 1.0

  • Riferimento: vedere la raccomandazione XML 1.0, §2.2 Caratteri

L’elenco globale dei caratteri consentiti è:

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

Fondamentalmente, i caratteri di controllo e i caratteri fuori dagli intervalli Unicode non sono consentiti. Ciò significa anche che chiamando ad esempio l’ quadro carattere  è vietato.

1.2. In XML 1.1

  • Riferimento: vedere la raccomandazione XML 1.1, §2.2 Caratteri e 1.3 Razionale e lista di modifiche per XML 1.1

L’elenco globale dei caratteri consentiti è:

[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]

Questa revisione della raccomandazione XML ha esteso i caratteri consentiti in modo che i caratteri di controllo siano consentiti e tenga conto di una nuova revisione dello standard Unicode, ma questi non sono ancora consentiti: NUL (x00) , xFFFE , xFFFF

Tuttavia, l’uso di caratteri di controllo e caratteri Unicode indefiniti è scoraggiato.

Si può anche notare che tutti i parser non sempre ne tengono conto e che i documenti XML con caratteri di controllo possono essere rifiutati.

2. Caratteri che devono essere sfuggiti (per ottenere un documento ben formato):

< Deve essere salvato con un < quadro, poiché si presume che sia l'inizio di un tag.

Il & deve essere scappato con un & quadro, poiché si presume che sia l'inizio un riferimento di entity framework

Il > dovrebbe essere sfuggito con > quadro. Non è obbligatorio, dipende dal contesto, ma si consiglia vivamente di evitarlo.

Il ' dovrebbe essere scappato con un ' quadro - obbligatoria negli attributi definiti all'interno di virgolette singole, ma si consiglia vivamente di evitarla sempre.

Il " dovrebbe essere sfuggito con un'entity framework " obbligatorio in attributi definiti tra virgolette doppie ma è consigliabile scappare sempre.

Questo è un codice C # per rimuovere i caratteri XML non validi da una stringa e restituire una nuova stringa valida.

 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, ""); } 

I personaggi predeclared sono:

 & < > " ' 

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

Un altro modo semplice per sfuggire ai caratteri XML / XHTML potenzialmente indesiderati in C # è:

 WebUtility.HtmlEncode(stringWithStrangeChars) 

In aggiunta alla risposta di potame, se vuoi scappare usando un blocco CDATA.

Se si inserisce il testo in un blocco CDATA, non è necessario utilizzare l’escaping . In tal caso puoi utilizzare tutti i caratteri nel seguente intervallo :

rappresentazione grafica di possibili caratteri

Nota: oltre a questo, non ti è permesso usare la sequenza di caratteri ]]> . Perché corrisponderebbe alla fine del blocco CDATA.

Se ci sono ancora caratteri non validi (ad es. Caratteri di controllo), allora probabilmente è meglio usare un qualche tipo di codifica (es. Base64).

Questa risposta ha funzionato per me

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

Dettagli in questo collegamento a Blog

Per gli utenti Java, Apache ha una class di utilità (StringEscapeUtils) con un metodo helper escapeXml che può essere utilizzato per l’escape di caratteri in una stringa utilizzando quadro XML.

Nel processore XML Woodstox, i caratteri non validi sono classificati da questo codice

 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"); 

Fonte da qui

Un altro modo per rimuovere caratteri XML errati in C # con l’uso del metodo XmlConvert.IsXmlChar (disponibile da .NET Framework 4.0)

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

oppure puoi controllare che tutti i caratteri siano validi per XML.

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

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

Ad esempio, il simbolo di tabulazione verticale (\ v) non è valido per XML, è UTF-8 valido, ma non è valido XML 1.0 e anche molte librerie (incluso libxml2) lo perdono e emettono in modo non valido XML non valido.

 ampersand (&) is escaped to & double quotes (") are escaped to " single quotes (') are escaped to ' less than (<) is escaped to < greater than (>) is escaped to > 

In C #, utilizzare System.Security.SecurityElement.Escape o System.Net.WebUtility.HtmlEncode per evitare questi caratteri non validi.

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

Qualcuno ha provato questo System.Security.SecurityElement.Escape(yourstring) ? Questo sostituirà i caratteri XML non validi in una stringa con il loro equivalente valido

Per XSL (in giorni veramente pigri) uso:

 capture="&(?!amp;)" capturereplace="&amp;" 

per tradurre tutti & -segni che non sono follwed på amp; a quelli giusti.

Abbiamo casi in cui l’input è in CDATA ma il sistema che utilizza l’XML non ne tiene conto. È una correzione sciatta, fai attenzione …