Je travaille avec du XML qui contient des chaînes comme:
<node>This is a string</node>
Certaines des chaînes que je passe aux nœuds auront des personnages comme &
, #
, $
, etc .:
<node>This is a string & so is this</node>
Ce n'est pas valable en raison de &
.
Je ne peux pas envelopper ces chaînes dans CDATA car elles doivent être telles qu'elles sont. J'ai essayé de chercher une liste de caractères qui ne peuvent pas être mis dans des nœuds XML sans être dans un CDATA.
Quelqu'un peut-il m'orienter vers l'un ou me fournir une liste de personnages illégaux?
Réponses:
Les seuls caractères illégaux sont
&
,<
et>
(ainsi que"
ou'
dans les attributs).Ils échappèrent à l' aide des entités XML , dans ce cas , vous voulez
&
pour&
.Vraiment, cependant, vous devriez utiliser un outil ou une bibliothèque qui écrit du XML pour vous et résume ce genre de chose pour vous afin que vous n'ayez pas à vous en soucier.
la source
OK, séparons la question des personnages qui:
La réponse fournie par @dolmen dans " Quels sont les caractères non valides dans XML " est toujours valide mais doit être mise à jour avec la spécification XML 1.1.
1. Caractères non valides
Les caractères décrits ici sont tous les caractères autorisés à être insérés dans un document XML.
1.1. En XML 1.0
La liste globale des caractères autorisés est:
Fondamentalement, les caractères de contrôle et les caractères hors des plages Unicode ne sont pas autorisés. Cela signifie également que l'appel par exemple de l'entité caractère

est interdit.1.2. Dans XML 1.1
La liste globale des caractères autorisés est:
Cette révision de la recommandation XML a étendu les caractères autorisés afin que les caractères de contrôle soient autorisés, et prend en compte une nouvelle révision de la norme Unicode, mais celles-ci ne sont toujours pas autorisées: NUL (x00) , xFFFE , xFFFF ...
Cependant, l'utilisation de caractères de contrôle et de caractères Unicode non définis est déconseillée.
On peut également remarquer que tous les analyseurs ne prennent pas toujours cela en compte et les documents XML avec des caractères de contrôle peuvent être rejetés.
2. Caractères à échapper (pour obtenir un document bien formé):
Le
<
doit être échappé avec une<
entité, car il est supposé être le début d'une balise.Le
&
doit être échappé avec une&
entité, car il est supposé être le début d'une référence d'entitéLe
>
doit être échappé avec l'>
entité. Ce n'est pas obligatoire - cela dépend du contexte - mais il est fortement conseillé d'y échapper.Le
'
doit être échappé avec une'
entité - obligatoire dans les attributs définis entre guillemets simples mais il est fortement conseillé de toujours l'échapper.Le
"
devrait être échappé avec une"
entité - obligatoire dans les attributs définis entre guillemets, mais il est fortement conseillé de toujours l'échapper.la source
La liste des caractères valides se trouve dans la spécification XML :
la source
& < > " '
ils doivent être échappés dans certains contextes.Il s'agit d'un code C # pour supprimer les caractères non valides XML d'une chaîne et renvoyer une nouvelle chaîne valide.
la source
\u10000
et en\u10FFFF
tant que caractères uniques car ils nécessitent deuxchar
instances utf-16 chacun, et selon les documents, il pourrait ne pas y avoir plus de 4 chiffres.[\u10000-\u10FFFF]
est très probablement analysé comme [\u1000
,0-\u10FF
,F
,F
] qui est bizarre, mais juridique.Les caractères pré-déclarés sont:
Voir « Quels sont les caractères spéciaux en XML? » Pour plus d'informations.
la source
En plus de la réponse de potame, si vous voulez vous échapper en utilisant un bloc CDATA.
Si vous placez votre texte dans un bloc CDATA, vous n'avez pas besoin d'utiliser d'échappement . Dans ce cas, vous pouvez utiliser tous les caractères de la plage suivante :
Remarque: En plus de cela, vous n'êtes pas autorisé à utiliser la
]]>
séquence de caractères. Parce qu'il correspondrait à la fin du bloc CDATA.S'il y a encore des caractères invalides (par exemple des caractères de contrôle), alors il est probablement préférable d'utiliser une sorte de codage (par exemple base64).
la source
Un autre moyen simple d'échapper aux caractères XML / XHTML potentiellement indésirables en C # est:
la source
Une autre façon de supprimer les caractères XML incorrects en C # est d'utiliser
XmlConvert.IsXmlChar
(Disponible depuis .NET Framework 4.0)ou vous pouvez vérifier que tous les caractères sont valides pour XML:
.Net Fiddle
Par exemple, le symbole de tabulation verticale (
\v
) n'est pas valide pour XML, il est UTF-8 valide, mais pas XML 1.0 valide, et même de nombreuses bibliothèques (y compris libxml2) le manquent et produisent silencieusement du XML invalide.la source
En résumé, les caractères valides dans le texte sont:
&
et<
.>
n'est pas valide s'il suit]]
.Les sections 2.2 et 2.4 de la spécification XML fournissent la réponse en détail:
Personnages
Données de caractère
la source
" XmlWriter et les caractères ASCII inférieurs " ont fonctionné pour moi
la source
En C #, utilisez
System.Security.SecurityElement.Escape
ouSystem.Net.WebUtility.HtmlEncode
pour échapper à ces caractères illégaux.la source
Pour les gens Java, Apache a une classe utilitaire (
StringEscapeUtils
) qui a une méthode d'assistanceescapeXml
qui peut être utilisée pour échapper des caractères dans une chaîne à l'aide d'entités XML.la source
Dans le processeur XML Woodstox, les caractères non valides sont classés par ce code:
Source d' ici
la source
Quelqu'un a essayé ça
System.Security.SecurityElement.Escape(yourstring)
? Cela remplacera les caractères XML non valides dans une chaîne par leur équivalent valide.la source
Pour XSL (les jours vraiment paresseux) j'utilise:
pour traduire tous les signes & qui ne sont pas suivis på amp; aux bons.
Nous avons des cas où l'entrée est en CDATA mais le système qui utilise le XML n'en tient pas compte. C'est une solution bâclée, méfiez-vous ...
la source