using System.Collections.Generic;
using System.Xml.Serialization;
public static class XmlSerializationHelper
public static string GetOuterXml(this XmlNode node, bool indent = false, Encoding encoding = null, bool omitXmlDeclaration = false)
using var stream = new MemoryStream();
node.Save(stream, indent : indent, encoding : encoding, omitXmlDeclaration : omitXmlDeclaration, closeOutput : false);
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
public static void Save(this XmlNode node, Stream stream, bool indent = false, Encoding encoding = null, bool omitXmlDeclaration = false, bool closeOutput = true) =>
node.Save(stream, new XmlWriterSettings
Encoding = encoding ?? Encoding.UTF8,
OmitXmlDeclaration = omitXmlDeclaration,
CloseOutput = closeOutput,
public static void Save(this XmlNode node, Stream stream, XmlWriterSettings settings)
using var xmlWriter = XmlWriter.Create(stream, settings);
using var outerWriter = (settings?.Encoding != null && settings?.Encoding?.CodePage != Encoding.UTF8.CodePage) ? new TolerantCommentEncodingXmlWriter(xmlWriter, settings.Encoding) : null;
node.WriteTo(outerWriter ?? xmlWriter);
public class TolerantCommentEncodingXmlWriter : XmlWriterDecorator
Encoding CommentEncoding { get; }
public TolerantCommentEncodingXmlWriter(XmlWriter baseWriter, Encoding commentEncoding) : base(baseWriter) => this.CommentEncoding = commentEncoding;
public override void WriteComment(string text) =>
base.WriteComment(CommentEncoding?.GetString(CommentEncoding?.GetBytes(text)) ?? text);
public class XmlWriterDecorator : XmlWriter
readonly XmlWriter baseWriter;
public XmlWriterDecorator(XmlWriter baseWriter) => this.baseWriter = baseWriter ?? throw new ArgumentNullException();
protected virtual bool IsSuspended { get { return false; } }
public override WriteState WriteState => baseWriter.WriteState;
public override XmlWriterSettings Settings => baseWriter.Settings;
public override XmlSpace XmlSpace => baseWriter.XmlSpace;
public override string XmlLang => baseWriter.XmlLang;
public override void Close() => baseWriter.Close();
public override void Flush() => baseWriter.Flush();
public override string LookupPrefix(string ns) => baseWriter.LookupPrefix(ns);
public override void WriteBase64(byte[] buffer, int index, int count)
baseWriter.WriteBase64(buffer, index, count);
public override void WriteCData(string text)
baseWriter.WriteCData(text);
public override void WriteCharEntity(char ch)
baseWriter.WriteCharEntity(ch);
public override void WriteChars(char[] buffer, int index, int count)
baseWriter.WriteChars(buffer, index, count);
public override void WriteComment(string text)
baseWriter.WriteComment(text);
public override void WriteDocType(string name, string pubid, string sysid, string subset)
baseWriter.WriteDocType(name, pubid, sysid, subset);
public override void WriteEndAttribute()
baseWriter.WriteEndAttribute();
public override void WriteEndDocument()
baseWriter.WriteEndDocument();
public override void WriteEndElement()
baseWriter.WriteEndElement();
public override void WriteEntityRef(string name)
baseWriter.WriteEntityRef(name);
public override void WriteFullEndElement()
baseWriter.WriteFullEndElement();
public override void WriteProcessingInstruction(string name, string text)
baseWriter.WriteProcessingInstruction(name, text);
public override void WriteRaw(string data)
baseWriter.WriteRaw(data);
public override void WriteRaw(char[] buffer, int index, int count)
baseWriter.WriteRaw(buffer, index, count);
public override void WriteStartAttribute(string prefix, string localName, string ns)
baseWriter.WriteStartAttribute(prefix, localName, ns);
public override void WriteStartDocument(bool standalone) => baseWriter.WriteStartDocument(standalone);
public override void WriteStartDocument() => baseWriter.WriteStartDocument();
public override void WriteStartElement(string prefix, string localName, string ns)
baseWriter.WriteStartElement(prefix, localName, ns);
public override void WriteString(string text)
baseWriter.WriteString(text);
public override void WriteSurrogateCharEntity(char lowChar, char highChar)
baseWriter.WriteSurrogateCharEntity(lowChar, highChar);
public override void WriteWhitespace(string ws)
baseWriter.WriteWhitespace(ws);
public static void Test()
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml("<Root>‘<!--‘--></Root>");
var xml = xmlDoc.GetOuterXml(indent : true, encoding : Encoding.ASCII, omitXmlDeclaration : true);
var fileName = "Question72348095.xml";
using (var stream = new FileStream(fileName, FileMode.OpenOrCreate))
xmlDoc.Save(stream, indent : true, encoding : Encoding.ASCII, omitXmlDeclaration : true);
Console.WriteLine(File.ReadAllText(fileName));
Console.WriteLine(xmlDoc.GetOuterXml(indent : true, encoding : Encoding.Latin1, omitXmlDeclaration : true));
Console.WriteLine(xmlDoc.GetOuterXml(indent : true, encoding : Encoding.UTF8, omitXmlDeclaration : true));
Console.WriteLine(xmlDoc.GetOuterXml(indent : true, encoding : Encoding.Unicode, omitXmlDeclaration : true));
Console.WriteLine(xmlDoc.GetOuterXml(indent : true, omitXmlDeclaration : true));
public static void Main()
Console.WriteLine("Environment version: {0} ({1}, {2})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("Failed with unhandled exception: ");