J'utilise C # pour générer un fichier XML et je tente de définir la valeur d'encodage XML sur UTF-8, mais le résultat est actuellement affiché:
<?xml version="1.0"?>
Ceci est mon code:
public sealed class StringWriterWithEncoding: StringWriter {
private readonly Encoding encoding;
public StringWriterWithEncoding(Encoding encoding) {
this.encoding = encoding;
}
public override Encoding Encoding {
get {
return encoding;
}
}
}
private string GetXml(JobStore jobStore) {
StringWriterWithEncoding sw = new StringWriterWithEncoding();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Encoding = Encoding.GetEncoding("utf-8");
settings.Indent = true;
using(var writer = XmlWriter.Create(sw, settings)) {
writer.WriteStartDocument();
writer.WriteStartElement("resources");
writer.WriteStartElement("string");
writer.WriteAttributeString("name");
writer.WriteCData("value");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
return sw.ToString();
}
Doit être quelque chose de simple me manque?
Votre code ne compile pas - StringWriterWithEncoding
n'a pas de constructeur sans paramètre. Ou, si elle a un constructeur sans paramètre, peut-être que ça ressemble à ça?
public sealed class StringWriterWithEncoding : StringWriter
{
private readonly Encoding encoding;
public StringWriterWithEncoding() { }
public StringWriterWithEncoding(Encoding encoding)
{
this.encoding = encoding;
}
public override Encoding Encoding
{
get { return encoding; }
}
}
Si tel est le cas, cela expliquerait votre problème: le champ encoding
a été laissé à sa valeur par défaut (null), ce qui signifie que Encoding
renvoie null et qu'aucun codage n'apparaîtra dans le fichier XML.
Pour résoudre ce problème, éliminez le constructeur sans paramètre et faites:
var sw = new StringWriterWithEncoding(Encoding.UTF8);
Ou changez le constructeur sans paramètre pour définir explicitement Encoding.UTF8
:
public sealed class StringWriterWithEncoding : StringWriter
{
private readonly Encoding encoding;
public StringWriterWithEncoding() : this(Encoding.UTF8) { }
public StringWriterWithEncoding(Encoding encoding)
{
this.encoding = encoding;
}
public override Encoding Encoding
{
get { return encoding; }
}
}
Utilisez simplement le nom du fichier de sortie pour XmlWriter au lieu de StringWriterWithEncoding:
var settings = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
Indent = true
};
using (var writer = XmlWriter.Create(filePathName, settings))
{
...