web-dev-qa-db-fra.com

XmlWriter pour écrire dans une chaîne plutôt que dans un fichier

J'ai un service WCF qui doit renvoyer une chaîne de code XML. Mais il semble que l’écrivain ne souhaite 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!!

110
Blaze

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();
}
204
Richard

Comme Richard l'a dit, StringWriter est la voie à suivre. Il y a cependant un problème: par défaut, StringWriter s'annonce comme étant en UTF-16. Habituellement 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, veillez à utiliser un codage qui correspond à celui que vous corrigez pour le StringWriter. (Le code ci-dessus suppose toujours UTF-8; il est trivial de créer une version plus générale acceptant un codage dans le constructeur.)

Vous utiliseriez alors:

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

Je sais que c'est vieux et a répondu, mais voici une autre façon de le faire. En particulier si vous ne souhaitez pas que la nomenclature UTF8 soit placée au début de votre chaîne et que le texte soit mis 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());
}
29
brianary

Utilisez StringBuilder:

var sb = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(sb))
    {
        ...
    }
return sb.ToString();
12
Ria

Les gars n'oublient pas d'appeler xmlWriter.Close () et xmlWriter.Dispose (), sinon votre chaîne ne finira pas de créer. Ce sera juste une chaîne vide

1
saunupe1911