Existe-t-il une fonction C # qui pourrait être utilisée pour échapper et déséchapper une chaîne, qui pourrait être utilisée pour remplir le contenu d'un élément XML?
J'utilise VSTS 2008 + C # + .Net 3.0.
EDIT 1: Je suis concaténer simple et fichier XML court et je ne l' utilise sérialisation, donc je dois échapper explicitement le caractère XML à la main, par exemple, je dois mettre a<b
en <foo></foo>
, donc j'ai besoin échapper corde a<b
et de le mettre dans l' élément foo.
new XText(unescaped).ToString()
Réponses:
la source
HttpUtility.HtmlEncode
deSystem.Web
pourrait être utilisé en toute sécurité?SecurityElement.Escape (chaîne s)
la source
EDIT: Vous dites "Je concatène un fichier XML simple et court et je n'utilise pas de sérialisation, donc j'ai besoin d'échapper explicitement au caractère XML à la main".
Je vous déconseille fortement de le faire à la main. Utilisez les API XML pour tout faire pour vous - lisez les fichiers d'origine, fusionnez les deux en un seul document comme vous en avez besoin (vous voulez probablement l'utiliser
XmlDocument.ImportNode
), puis réécrivez-le. Vous ne voulez pas écrire vos propres analyseurs / formateurs XML. La sérialisation est quelque peu hors de propos ici.Si vous pouvez nous donner un exemple bref mais complet de ce que vous essayez de faire exactement, nous pouvons probablement vous aider à éviter d'avoir à vous soucier de vous échapper en premier lieu.
Réponse originale
Ce que vous voulez dire n'est pas tout à fait clair, mais normalement les API XML le font pour vous. Vous définissez le texte dans un nœud, et il échappera automatiquement à tout ce dont il a besoin. Par exemple:
Exemple LINQ to XML:
Exemple DOM:
Résultat des deux exemples:
Cela suppose que vous vouliez que XML s'échappe, bien sûr. Si ce n'est pas le cas, veuillez publier plus de détails.
la source
Merci à @sehe pour l'évasion en une ligne:
J'ajoute à cela le un-escape d'une ligne:
la source
George, c'est simple. Utilisez toujours les API XML pour gérer XML. Ils font tout ce qui vous échappe et ne vous échappe pas.
Ne créez jamais de XML en ajoutant des chaînes.
la source
XmlElementSyntax
. Et c'est aussi compliqué par le fait que vous devez aussi générer le///
. Et je ne peux pas générer chaque ligne séparémentXObject
, car cela ne fonctionnerait pas pour les balises multilignes.///
devant, puis reformatez le code. Ce n'est pas un gros problème, et certainement une affaire de coin. Si c'est absolument nécessaire, je suis sûr que vous pouvez créer une personnalisationXmlWriter
pour faire des sauts de ligne et des espaces comme vous le souhaitez, mais en les plaçant///
devant de nouvelles lignes. Vous pouvez également utiliser un XSLT pour imprimer correctement le XML. Mais dans tous les cas, XML doit toujours être généré par une API XML.Et si vous voulez, comme moi quand j'ai trouvé cette question, échapper aux noms de nœuds XML, comme par exemple lors de la lecture à partir d'une sérialisation XML, utilisez le moyen le plus simple:
Il échappera également les espaces et tous les caractères non valides pour les éléments XML.
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
la source
AVERTISSEMENT: Nécromance
La réponse de Darin Dimitrov + System.Security.SecurityElement.Escape (string s) n'est toujours pas complète.
Dans XML 1.1, le moyen le plus simple et le plus sûr est de simplement encoder TOUT.
Comme
	
pour \ t.Il n'est pas du tout pris en charge dans XML 1.0.
Pour XML 1.0, une solution de contournement possible consiste à encoder en base 64 le texte contenant le (s) caractère (s).
XML 1.0:
la source
Une autre prise basée sur la réponse de John Skeet qui ne renvoie pas les balises :
Cela renvoie uniquement la valeur transmise, au format encodé XML:
la source
Les fonctions suivantes feront le travail. Je n'ai pas testé contre XmlDocument, mais je suppose que c'est beaucoup plus rapide.
la source
Utilisation d'une bibliothèque tierce ( Newtonsoft.Json ) comme alternative:
Exemple:
a<b
<==>"a<b"
<foo></foo>
<==>"foo></foo>"
la source