Soit écrivez explicitement la déclaration, soit utilisez un StringWriter
et appelez Save()
:
using System;
using System.IO;
using System.Text;
using System.Xml.Linq;
class Test
{
static void Main()
{
string xml = @"<?xml version='1.0' encoding='utf-8'?>
<Cooperations>
<Cooperation />
</Cooperations>";
XDocument doc = XDocument.Parse(xml);
StringBuilder builder = new StringBuilder();
using (TextWriter writer = new StringWriter(builder))
{
doc.Save(writer);
}
Console.WriteLine(builder);
}
}
Vous pouvez facilement ajouter cela comme méthode d'extension:
public static string ToStringWithDeclaration(this XDocument doc)
{
if (doc == null)
{
throw new ArgumentNullException("doc");
}
StringBuilder builder = new StringBuilder();
using (TextWriter writer = new StringWriter(builder))
{
doc.Save(writer);
}
return builder.ToString();
}
Cela a l'avantage que cela ne fonctionnera pas s'il n'y a pas de déclaration :)
Ensuite, vous pouvez utiliser:
string x = doc.ToStringWithDeclaration();
Notez que cela utilisera utf-16 comme encodage, car c'est l'encodage implicite dans StringWriter
. Vous pouvez cependant influencer cela vous-même en créant une sous-classe de StringWriter
, par exemple pour toujours utiliser UTF-8 .
XDocument.Save(TextWriter)
implémentation et il ignore simplement le codage de la déclaration, par opposition aux implémentationsXDocument.Save(String)
ouXDocument.Save(Stream)
. Je me demande pourquoi ...StringWriter
, sauf si vous en utilisez un qui remplace laEncoding
propriété. J'ai une autre réponse à ce sujet. Je pensais que vous disiez qu'il abandonnait entièrement "l'encodage" ...