95 votes

Échappement de chaînes de caractères en XML

Existe-t-il une fonction C# qui pourrait être utilisée pour échapper et déséchapper une chaîne de caractères, 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 concatène un fichier XML simple et court et je n'utilise pas la sérialisation, donc je dois explicitement échapper les caractères XML à la main, par exemple, je dois mettre a<b en <foo></foo> J'ai donc besoin d'une chaîne d'échappement a<b et le mettre dans l'élément foo.

0 votes

15 votes

Le plus court auquel je puisse penser : new XText(unescaped).ToString()

3 votes

Pour toute personne tombant sur ce problème, j'ai trouvé que c'était la meilleure réponse : stackoverflow.com/a/5304827/1224069

132voto

Dana Holt Points 7150

9 votes

Cette réponse échappe aux guillemets, contrairement à la réponse sélectionnée.

2 votes

Cette réponse ne semble pas fonctionner avec des caractères non valides tels que

2 votes

Cette réponse est incomplète. Elle ne répond qu'à la moitié de la question.

78voto

Darin Dimitrov Points 528142
public static string XmlEscape(string unescaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerText = unescaped;
    return node.InnerXml;
}

public static string XmlUnescape(string escaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerXml = escaped;
    return node.InnerText;
}

5 votes

Vous n'avez même pas besoin d'ajouter l'élément au document. Cependant, je persiste à dire qu'il est préférable de ne pas essayer de le faire dès le départ - on dirait que George se donne du mal en faisant les choses à la main...

0 votes

Je suis tout à fait d'accord avec vous Jon. Je ne savais pas qu'il n'était pas nécessaire d'ajouter le nœud pour que cela fonctionne. C'est pourquoi j'aime StackOverflow - j'apprends tellement de choses chaque jour.

15 votes

Je n'aime vraiment pas cette réponse parce qu'elle est trop lourde. XmlDocument va utiliser XmlReader/XmlWriter pour faire le vrai travail, alors pourquoi ne pas aller droit au but et éviter ce DOM lourd ?

40voto

Jon Skeet Points 692016

EDIT : Vous dites "Je concatène un fichier XML simple et court et je n'utilise pas la sérialisation, donc je dois explicitement échapper les caractères XML à la main".

Je voudrais fortement vous conseille de ne pas le faire à la main. Utilisez les API XML pour faire tout cela à votre place - lisez les fichiers d'origine, fusionnez les deux en un seul document de la manière dont vous le souhaitez (vous voudrez probablement utiliser le module XmlDocument.ImportNode ), puis l'écrire à nouveau. 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 court mais complet de ce que vous essayez de faire exactement, nous pourrons probablement vous aider à ne pas 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 font cela pour vous. Vous définissez le texte dans un nœud, et il échappe automatiquement tout ce qui est nécessaire. Par exemple :

Exemple de LINQ to XML :

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XElement element = new XElement("tag",
                                        "Brackets & stuff <>");

        Console.WriteLine(element);
    }
}

Exemple de DOM :

using System;
using System.Xml;

class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        XmlElement element = doc.CreateElement("tag");
        element.InnerText = "Brackets & stuff <>";
        Console.WriteLine(element.OuterXml);
    }
}

Sortie des deux exemples :

<tag>Brackets &amp; stuff &lt;&gt;</tag>

Cela suppose que vous souhaitiez l'échappement XML, bien sûr. Si ce n'est pas le cas, veuillez fournir plus de détails.

0 votes

Merci Jon, j'ai mis plus de détails dans mon message original EDIT 1 section. J'apprécierais si vous pouviez me donner des commentaires et des conseils :-)

0 votes

"après l'échappement XML" -- vous voulez dire ? Pourriez-vous utiliser d'autres mots, s'il vous plaît ? L'anglais n'est pas ma langue maternelle :-)

0 votes

Bonjour Jon, comment décomposer le format XML en un format de chaîne normal, c'est-à-dire qu'à partir de l'entrée "Brackets & stuff <>", on obtient la sortie "Brackets & stuff <>" ?

27voto

Keith Robertson Points 442

Merci à @sehe pour l'échappatoire d'une ligne :

var escaped = new System.Xml.Linq.XText(unescaped).ToString();

J'y ajoute l'un-escape d'une ligne :

var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();

0 votes

XText n'échappe pas aux guillemets.

9voto

John Saunders Points 118808

George, c'est simple. Utilisez toujours les API XML pour manipuler le XML. Elles font tout l'encodage et le désencapsulage pour vous.

Ne créez jamais de XML en ajoutant des chaînes de caractères.

0 votes

Des mots pour vivre. Il existe de nombreuses options d'API XML, mais la seule chose sur laquelle nous devrions tous être d'accord est que la concaténation manuelle de chaînes de caractères n'est pas acceptable.

0 votes

Bien que je sois généralement d'accord avec cela, il peut y avoir quelques cas très rares où l'échappement manuel peut être nécessaire. Par exemple, lors de la création d'une documentation XML à l'aide de Roslyn.

0 votes

@svick : pourquoi ne pas créer le XML en utilisant LINQ to XML, et ensuite utiliser .ToString() ?

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