using System.Collections.Generic;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
class CustomerAliasXmlEditor : XmlStreamingEditor
static readonly XNamespace customerNamespace = "";
public static void TransformFromTo(string fromFilePath, XmlReaderSettings readerSettings, string toFilePath, XmlWriterSettings writerSettings)
using (var xmlReader = XmlReader.Create(fromFilePath, readerSettings))
using (var xmlWriter = XmlWriter.Create(toFilePath, writerSettings))
new CustomerAliasXmlEditor(xmlReader, xmlWriter).Process();
public CustomerAliasXmlEditor(XmlReader reader, XmlWriter writer)
: base(reader, writer, ShouldTransform, Transform)
static bool ShouldTransform(XmlReader reader)
return reader.GetElementName() == customerNamespace + "customer";
static void Transform(XmlReader from, XmlWriter to)
var customer = XElement.Load(from);
var alias = customer.Element(customerNamespace + "alias");
var name = customer.Element(customerNamespace + "name");
name = new XElement(customerNamespace + "name");
public static partial class XmlReaderExtensions
public static XName GetElementName(this XmlReader reader)
if (reader.NodeType != XmlNodeType.Element)
string localName = reader.Name;
string uri = reader.NamespaceURI;
return XName.Get(localName, uri);
public static class XmlWriterExtensions
public static void WriteShallowNode(this XmlWriter writer, XmlReader reader)
throw new ArgumentNullException("reader");
throw new ArgumentNullException("writer");
case XmlNodeType.Element:
writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
writer.WriteAttributes(reader, true);
if (reader.IsEmptyElement)
writer.WriteEndElement();
writer.WriteString(reader.Value);
case XmlNodeType.Whitespace:
case XmlNodeType.SignificantWhitespace:
writer.WriteWhitespace(reader.Value);
writer.WriteCData(reader.Value);
case XmlNodeType.EntityReference:
writer.WriteEntityRef(reader.Name);
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
case XmlNodeType.DocumentType:
writer.WriteDocType(reader.Name, reader.GetAttribute("PUBLIC"), reader.GetAttribute("SYSTEM"), reader.Value);
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
System.Diagnostics.Debug.WriteLine("unknown NodeType " + reader.NodeType);
public abstract class XmlStreamingEditorBase
readonly XmlReader reader;
readonly XmlWriter writer;
readonly Predicate<XmlReader> shouldTransform;
public XmlStreamingEditorBase(XmlReader reader, XmlWriter writer, Predicate<XmlReader> shouldTransform)
this.shouldTransform = shouldTransform;
protected XmlReader Reader { get { return reader; } }
protected XmlWriter Writer { get { return writer; } }
if (Reader.NodeType == XmlNodeType.Element)
if (shouldTransform(Reader))
Writer.WriteShallowNode(Reader);
protected abstract void EditCurrentElement();
public class XmlStreamingEditor : XmlStreamingEditorBase
readonly Action<XmlReader, XmlWriter> transform;
public XmlStreamingEditor(XmlReader reader, XmlWriter writer, Predicate<XmlReader> shouldTransform, Action<XmlReader, XmlWriter> transform)
: base(reader, writer, shouldTransform)
this.transform = transform;
protected override void EditCurrentElement()
using (var subReader = Reader.ReadSubtree())
transform(subReader, Writer);
public static void Test()
var readerSettings = new XmlReaderSettings { IgnoreWhitespace = true };
var writerSettings = new XmlWriterSettings { Indent = true };
var xml1 = Test(GetXml(), readerSettings, writerSettings);
var xml2 = Test(XDocument.Parse(GetXml()).ToString(SaveOptions.DisableFormatting), readerSettings, writerSettings);
XNode.DeepEquals(XElement.Parse(xml1), XElement.Parse(xml2));
Console.WriteLine("\nDone.");
public static string Test(string xml, XmlReaderSettings readerSettings, XmlWriterSettings writerSettings)
string fromFileName = "Question48574631_original.xml";
string toFileName = "Question48574631_edited.xml";
File.WriteAllText(fromFileName, xml);
Console.WriteLine("Input XML file {0}: ", fromFileName);
CustomerAliasXmlEditor.TransformFromTo(fromFileName, readerSettings, toFileName, writerSettings);
Console.WriteLine("\nResults of editing:");
var allXml = File.ReadAllText(toFileName);
Console.WriteLine(allXml);
if (File.Exists(fromFileName))
File.Delete(fromFileName);
if (File.Exists(toFileName))
<name><first>Robert</first></name>
<name><first>Robert</first></name>
<name><first>Robert</first></name>
<name><first>Robert</first></name>
<name><first>Robert</first></name>
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");
public static void Main()
Console.WriteLine("Roslyn 2.0 Compiler; Environment version: " + Environment.Version);
Console.WriteLine("Uncaught exception: ");