264 votes

Quels sont les caractères non valides dans le XML

Je travaille avec du XML qui contient des chaînes de caractères :

<node>This is a string</node>

Certaines des chaînes de caractères que je transmets aux nœuds contiennent des caractères tels que & , # , $ etc :

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

Ceci n'est pas valable en raison de & .

Je ne peux pas envelopper ces chaînes dans des CDATA car elles doivent rester telles quelles. J'ai essayé de chercher une liste de caractères qui ne peuvent pas être placés dans des nœuds XML sans être dans un CDATA.

Quelqu'un peut-il m'en indiquer un ou me fournir une liste de caractères illégaux ?

4 votes

Une raison valable pour ne pas utiliser les CDATA ?

2 votes

Oui, je passe la chaîne de caractères à un CMS appelé Fatwire et le nœud avec les données ne peut pas être dans un CDATA, je ne suis pas sûr pourquoi c'est la façon dont Fatwire fonctionne :(

0 votes

@Peter : Comment puis-je utiliser CDATA dans mon cas ? stackoverflow.com/questions/6906705/

176voto

dolmen Points 2196

La liste des caractères valides se trouve dans le Spécification XML :

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

8 votes

Vous devez noter que, bien qu'il s'agisse de caractères légaux, & < > " ' doivent être échappés dans certains contextes.

7 votes

"Légales" dans ce contexte signifie que leurs valeurs finales décodées sont légales, et non qu'elles sont légales dans le flux. Comme ci-dessus, certaines valeurs légales doivent être échappées dans le flux.

0 votes

J'ai un problème où 0x1c est un caractère illégal... Je cherche une possibilité en java pour éviter ces....

166voto

Welbog Points 32952

Les seuls caractères illégaux sont & , < et > (ainsi que " ou ' dans les attributs, en fonction du caractère utilisé pour délimiter la valeur de l'attribut : attr="must use &quot; here, ' is allowed" et attr='must use &apos; here, " is allowed' ).

Ils s'échappent en utilisant Entités XML dans ce cas, vous voulez &amp; pour & .

En réalité, il est préférable d'utiliser un outil ou une bibliothèque qui écrit le XML pour vous et fait abstraction de ce genre de choses afin que vous n'ayez pas à vous en soucier.

1 votes

[Et '>' n'est pas toujours ont de s'échapper, non plus, bien que ce soit probablement plus facile de le faire. Seule la chaîne ']]>' est invalide (dans le contenu de l'élément). C'est un peu une verrue étrange en fait].

91 votes

Certains caractères de contrôle ne sont pas non plus autorisés. Voir ma réponse ci-dessous.

48 votes

En fait, ce n'est pas tout à fait vrai. Un certain nombre de caractères ascii inférieurs sont également invalides. Si vous essayez d'écrire 0x03 dans un document Xml, vous obtenez généralement une erreur et si vous parvenez à l'échapper correctement dans un document XML, la plupart des visualisateurs se plaindront du caractère non valide. C'est un cas limite mais cela arrive.

61voto

mathifonseca Points 420

Il s'agit d'un code C# permettant de supprimer les caractères XML invalides d'une chaîne et de renvoyer une nouvelle chaîne valide.

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

6 votes

Pour Java, le modèle regex serait le même. Vous pouvez alors utiliser la méthode appelée replaceAll dans la classe String qui attend un modèle regex comme paramètre. Regardez ça : docs.oracle.com/javase/6/docs/api/java/lang/

3 votes

J'ai de tels caractères invalides dans ma chaîne : SUSITARIMO DL DARBO SUTARTIES Ce code n'est pas supprimé Donc le document xml ne s'initialise pas.

2 votes

Je pense que vous ne pouvez pas simplement mettre ce modèle dans un constructeur de regex .NET. Je ne pense pas qu'il reconnaisse \u10000 et \u10FFFF en tant que caractères uniques car ils nécessitent deux utf-16 char instances chacune, et selon le docs il n'y a peut-être pas plus de 4 chiffres. [\u10000-\u10FFFF] est très probablement interprété comme [ \u1000 , 0-\u10FF , F , F ] ce qui est bizarre mais légal.

17voto

altCognito Points 23944

Les caractères pré-déclarés sont :

& < > " '

Voir " Quels sont les caractères spéciaux dans le XML ? "pour plus d'informations.

0 votes

Faux. Ils ne sont pas tous invalides. Seuls & et < sont toujours invalides dans le texte.

5voto

tiands Points 19

Un autre moyen simple d'échapper aux caractères XML / XHTML potentiellement indésirables en C# est le suivant :

WebUtility.HtmlEncode(stringWithStrangeChars)

0 votes

Caractères non valides

2 votes

Il a écrit Xml pas Html.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X