Décomposer des entités XML en utilisant XmlReader dans .NET?
J'essaie de ne pas encoder des entités XML dans une chaîne de caractères .NET (C#), mais je ne semble pas qu'il fonctionne correctement.
Par exemple, si j'ai la chaîne AT&T
il devrait être traduit à AT&T
.
Une façon est d'utiliser HttpUtility.HtmlDecode(), mais c'est pour HTML.
J'ai donc deux questions à ce sujet:
- Est-il sécuritaire d'utiliser HttpUtility.HtmlDecode() pour le décodage des entités XML?
- Comment puis-je utiliser XmlReader (ou quelque chose de similaire) pour ce faire? J'ai essayé ce qui suit, mais qui renvoie toujours une chaîne vide:
static string ReplaceEscapes(string text) { StringReader reader = new StringReader(text); XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; using (XmlReader xmlReader = XmlReader.Create(reader, settings)) { return xmlReader.ReadString(); } }
source d'informationauteur Philippe Leybaert
Vous devez vous connecter pour publier un commentaire.
Votre #2 solution peut fonctionner, mais vous devez appeler
xmlReader.Read();
(ouxmlReader.MoveToContent();
) avantReadString
.Je suppose que #1 serait également acceptable, même si il y a de ces cas limites comme
®
qui est un code HTML valide entité, mais pas une entité XML – qu'est ce que votre unescaper faire avec elle? Lever une exception comme un analyseur XML, ou juste retour“®”, comme l'analyseur HTML ferait?HTML échapper et XML sont étroitement liés. comme vous l'avez dit,
HttpUtility
a deuxHtmlEncode
etHtmlDecode
méthodes. Ils seront également fonctionner sur XML, comme il y a seulement quelques entités qui ont besoin d'échappement:<
,>
,\
,'
et&
en format HTML et XML.L'inconvénient de l'utilisation de la
HttpUtility
classe, c'est que vous avez besoin d'une référence à laSystem.Web
dll, ce qui amène un tas d'autres choses que vous ne voulez probablement pas.Spécifiquement pour XML, le
SecurityElement
classe a unEscape
méthode qui permettra de faire de l'encodage, mais n'a pas de correspondantUnescape
méthode. Par conséquent, vous avez quelques options:HttpUtility.HtmlDecode()
et mettre en place avec une référence àSystem.Web
rouler vos propres décoder méthode qui prend en charge les caractères spéciaux (comme il y a seulement une poignée d'entre eux, regarder le constructeur statique de
SecurityElement
Réflecteur pour voir la liste complète)utiliser un (hacky) solution:
.
Personnellement, je voudrais utiliser
HttpUtility.HtmlDecode()
si j'avais déjà une référence àSystem.Web
ou de rouler mon propre si pas. Je n'aime pas votreXmlReader
approche car il estDisposable
qui indiquent généralement que c'est à l'aide de ressources qui doivent être éliminés, et donc peut être une opération coûteuse.Cela fonctionne:
J'ai trouvé que la réponse sommet a un petit bug si votre saisie de texte se termine par certains caractères blancs, comme des retours chariot.
La chaîne "Test " perd de sa fuite de l'espace blanc.
Si vous combinez la solution de la question avec adrianbanks' wrapper balise, vous obtenez le résultat suivant, qui fonctionne.
Cela fonctionne aussi bien, et a le moins de code:
Update1: hmm, il semble qu'il ne fonctionne pas si encodeString est "", puis xtr.Read() retourne la valeur false.
Update2: ajout de la solution de contournement
Update3: cela semble fonctionner encore mieux