77 votes

XmlWriter pour écrire une chaîne au lieu d’un fichier

J'ai un service WCF qui doit renvoyer une chaîne de code XML. Mais il semble que l'écrivain ne veuille créer qu'un fichier, pas une chaîne. J'ai essayé:

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

Cela génère une erreur indiquant 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?

Merci!!

150voto

Richard Points 54016

Vous devez créer un StringWriter et le transmettre à XmlWriter.

La surcharge de chaîne de XmlWriter.Create concerne un nom de fichier.

Par exemple

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


  }
  return sw.ToString();
}
 

84voto

Jon Skeet Points 692016

Comme dit Richard, StringWriter est la voie à suivre. Il y a un hic cependant: par défaut, StringWriter fera de la publicité elle-même comme étant en UTF-16. Généralement XML est en UTF-8. Vous pouvez résoudre ce problème en sous-classement StringWriter;

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

Cela va affecter la déclaration écrite par XmlWriter. Bien sûr, si vous ecrivez la chaîne ailleurs dans la forme binaire, assurez-vous d'utiliser un encodage qui correspond selon le codage de vous fixer pour l' StringWriter. (Le code ci-dessus suppose toujours UTF-8; il est trivial, plus généralement, la version qui accepte un encodage dans le constructeur.)

Vous pouvez utiliser:

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

19voto

brianary Points 2584

Je sais que cela est ancien et a répondu, mais voici une autre façon de le faire, en particulier si vous ne voulez pas la nomenclature UTF8 au début de votre chaîne et que vous voulez que le texte soit en retrait:

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

8voto

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: