XmlTextWriter incorrecte de l'écriture des caractères de contrôle
.NET XmlTextWriter
crée des fichiers xml non valide.
En XML, certains caractères de contrôle sont autorisés, à l'instar de "horizontale onglet' (	
), mais d'autres ne sont pas, comme "l'onglet vertical' (
). (Voir spec.)
J'ai une chaîne de caractères qui contient un UTF-8 caractère de contrôle qui n'est pas autorisé dans XML.
Bien que XmlTextWriter
échappe le caractère, le XML est bien sûr encore valides.
Comment puis-je m'assurer que XmlTextWriter
produit jamais illégale d'un fichier XML?
Ou, s'il n'est pas possible de le faire avec XmlTextWriter
, comment puis-je bande les caractères de contrôle spécifiques qui ne sont pas autorisés dans les données XML à partir d'une chaîne de caractères?
Exemple de code:
using (XmlTextWriter writer =
new XmlTextWriter("test.xml", Encoding.UTF8))
{
writer.WriteStartDocument();
writer.WriteStartElement("Test");
writer.WriteValue("hello \xb world");
writer.WriteEndElement();
writer.WriteEndDocument();
}
De sortie:
<?xml version="1.0" encoding="utf-8"?><Test>hello  world</Test>
C'est vrai, vous ne pouvez pas. XML est pour le texte, pas pour les caractères de contrôle ou de données binaires. w3.org/TR/REC-xml/#charsets
OriginalL'auteur Tom Lokhorst | 2011-11-24
Vous devez vous connecter pour publier un commentaire.
Cette documentation d'un comportement qui est caché dans le la documentation de la méthode WriteString mais il semble que cela s'applique à l'ensemble de la classe.
Il semble donc que vous finissez par écrire des caractères non valides parce que vous êtes à l'aide de la classe XmlTextWriter. Une meilleure solution pour vous serait d'utiliser la Classe XmlWriter à la place.
XmlTextWriter
constructeur existe, vous n'êtes pas censé l'utiliser: msdn.microsoft.com/en-us/library/kkz7cs0d.aspxOriginalL'auteur jasso
Viens de trouver cette question quand j'ai été aux prises avec le même problème et j'ai fini par le résoudre avec une regex:
Espère que cela aide quelqu'un à une solution alternative.
OriginalL'auteur rocco
Construit en .NET évadés comme
SecurityElement.Escape
ne pas sortir correctement/bande.CheckCharacters
àfalse
sur l'écrivain et le lecteur, si votre application est la seule interaction avec le fichier. Le fichier XML résultant serait encore techniquement invalide.Voir:
CheckCharacters
àtrue
(qui est fait par défaut) est un peu trop strict car il sera tout simplement jeter une exception une approche alternative qui est plus indulgent pour des caractères XML non valides serait juste de bande:Googler un peu donné la liste blanche XmlTextEncoder cependant il va également supprimer
DEL
et d'autres dans la gamme U+007F–U+0084, U+0086–U+009F que, selon Caractères XML valides sur wikipédia ne sont valables que dans certains contextes et qui le RFC cite comme découragée, mais encore des caractères valides.Ce passe tous les XmlTextEncoder tests sauf pour celui qui s'attend à ce que la bande
DEL
quiXmlConvert.IsXmlChar
, Wikipedia, et la spécification des marques comme valide (bien que découragé).OriginalL'auteur Martijn Laarman