XmlWriter UTF-8 encoding using StringWriter in C #

I use C # to output the xml file and Im trying to set the xml encoding value to UTF-8, but currently it outputs:

<?xml version="1.0"?> 

This is my 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(); } 

Should there be something simple missing me?

+5
source share
2 answers

Your code does not compile - StringWriterWithEncoding does not have a constructor without parameters. Or, if it has a constructor without parameters, maybe it looks like this?

 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; } } } 

If so, this will explain your problem - the encoding field encoding left by default (null), which means that encoding returns null and therefore the encoding will not be displayed in the XML file.

To fix this, exclude the constructor without parameters and execute:

 var sw = new StringWriterWithEncoding(Encoding.UTF8); 

Or change the constructor without parameters to explicitly set 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; } } } 
+7
source

Just use the output file name for XmlWriter instead of StringWriterWithEncoding:

 var settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }; using (var writer = XmlWriter.Create(filePathName, settings)) { ... 
+1
source

Source: https://habr.com/ru/post/1264999/


All Articles