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