132 votes

XmlWriter pour écrire dans une chaîne de caractères plutôt que dans un fichier

J'ai un service WCF qui doit renvoyer une chaîne de caractères XML. Mais il semble que le rédacteur veuille seulement constituer un fichier, pas une chaîne. J'ai essayé :

string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))

Cela génère une erreur disant que nextXMLstring n'a pas de chemin de fichier. Il veut quelque chose comme :

using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))

Comment puis-je construire mon XML et le renvoyer ensuite sous forme de chaîne de caractères ?

Merci !

243voto

Richard Points 54016

Vous devez créer un StringWriter, et le passer au XmlWriter.

La surcharge de la chaîne de caractères de XmlWriter.Create est pour un nom de fichier.

Par exemple

using (var sw = new StringWriter()) {
  using (var xw = XmlWriter.Create(sw)) {
    // Build Xml with xw.

  }
  return sw.ToString();
}

121voto

Jon Skeet Points 692016

Comme l'a dit Richard, StringWriter est la voie à suivre. Il y a cependant un hic : par défaut, StringWriter s'affichera comme étant en UTF-16. Habituellement Le XML est en UTF-8. Vous pouvez résoudre ce problème en sous-classant StringWriter ;

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}

Cela affectera la déclaration écrite par XmlWriter . Bien sûr, si vous écrivez ensuite la chaîne ailleurs sous forme binaire, assurez-vous d'utiliser un encodage qui correspond à celui que vous avez fixé pour le fichier StringWriter . (Le code ci-dessus suppose toujours UTF-8 ; il est trivial de faire une version plus générale qui accepte un encodage dans le constructeur).

Vous utiliseriez alors :

using (TextWriter writer = new Utf8StringWriter())
{
    using (XmlWriter xmlWriter = XmlWriter.Create(writer))
    {
        ...
    }
    return writer.ToString();
}

33voto

brianary Points 2584

Je sais que cette question est ancienne et qu'on y a déjà répondu, mais voici une autre façon de procéder, en particulier si vous ne voulez pas que le BOM UTF8 se trouve au début de votre chaîne et que vous voulez que le texte soit indenté :

using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false)) 
  { Formatting = Formatting.Indented })
{
  // ...
  return Encoding.UTF8.GetString(ms.ToArray());
}

16voto

Ria Points 5743

Utilisez StringBuilder :

 var sb = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(sb))
    {
        ...
    }
return sb.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