using System.Collections.Generic;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Globalization;
using System.ComponentModel.DataAnnotations;
using System.Collections;
public class FullElementXmlTextWriter : XmlTextWriter
public FullElementXmlTextWriter(TextWriter w) : base(w) { }
public FullElementXmlTextWriter(Stream w, Encoding encoding) : base(w, encoding) { }
public FullElementXmlTextWriter(string filename, Encoding encoding) : base(filename, encoding) { }
public override void WriteEndElement()
base.WriteFullEndElement();
public class FullElementXmlWriterDecorator : XmlWriterDecorator
public FullElementXmlWriterDecorator(XmlWriter baseWriter) : base(baseWriter) { }
public override void WriteEndElement()
base.WriteFullEndElement();
public class XmlWriterDecorator : XmlWriter
readonly XmlWriter baseWriter;
public XmlWriterDecorator(XmlWriter baseWriter)
throw new ArgumentNullException();
this.baseWriter = baseWriter;
protected virtual bool IsSuspended { get { return false; } }
public override void Close()
public override void Flush()
public override string LookupPrefix(string ns)
return 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 WriteState WriteState
get { return baseWriter.WriteState; }
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 string GetXml()
string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<section name=""SystemConfiguration"" type=""Question32896165.V2.SystemConfigurationSection, Tile""/>
<SystemConfiguration id=""System1"" name=""System 1"">
<add id=""Equipment11"" equipmentType=""EQ"">
<add id=""EQ11Signal1"" signalId=""EQ11Signal1"" type=""Version"" />
<add id=""Equipment21"" equipmentType=""EQ"">
<add id=""EQ21Signal1"" signalId=""EQ21Signal1"" type=""Version"" />
<!-- And a whole lot more. Somewhere in the avenue of 30,000 <signals> entries.-->
internal static void Test()
XmlDocument myDoc = new XmlDocument();
var settings = new XmlWriterSettings { Indent = true };
Console.WriteLine("Original XmlDocument output: ");
TestOriginal(myDoc, settings);
Console.WriteLine("\nFullElementXmlWriterDecorator XmlDocument output: ");
TestFullElementXmlWriterDecorator(myDoc, settings);
Console.WriteLine("\nFullElementXmlTextWriter XmlDocument output: ");
TestFullElementXmlTextWriter(myDoc, Formatting.None);
Console.WriteLine("\nFullElementXmlTextWriter XmlDocument output with formatting: ");
TestFullElementXmlTextWriter(myDoc, Formatting.Indented);
private static void TestFullElementXmlWriterDecorator(XmlDocument myDoc, XmlWriterSettings settings)
using (var stringWriter = new StringWriter())
using (var innerXmlWriter = XmlWriter.Create(stringWriter, settings))
using (var xmlTextWriter = new FullElementXmlWriterDecorator(innerXmlWriter))
myDoc.WriteTo(xmlTextWriter);
xmltext = stringWriter.ToString();
Console.WriteLine(xmltext);
private static void TestFullElementXmlTextWriter(XmlDocument myDoc, Formatting formatting)
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = new FullElementXmlTextWriter(stringWriter) { Formatting = formatting })
myDoc.WriteTo(xmlTextWriter);
xmltext = stringWriter.ToString();
Console.WriteLine(xmltext);
var xmltextIndented = XDocument.Parse(xmltext).ToString();
private static void TestOriginal(XmlDocument myDoc, XmlWriterSettings settings)
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter, settings))
myDoc.WriteTo(xmlTextWriter);
xmltext = stringWriter.ToString();
Console.WriteLine(xmltext);
public static void Main()