.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.IO;
using System.Xml;

public class Program
{
    public static void Main(string[] args)
    {
        var xml = @"<a>
<b></b>
<e>
   <b></b>
   <c></c>
</e>
<i>
  <e>
    <b></b>
    <c></c>
  </e>
</i> 
</a>";

        var rs = new XmlReaderSettings
        {
            IgnoreWhitespace = true
        };

        var ws = new XmlWriterSettings
        {
            OmitXmlDeclaration = true,
            Indent = true
        };


        using (var reader = XmlReader.Create(new StringReader(xml), rs))
        using (var writer = XmlWriter.Create(Console.Out, ws))
        {
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        var subTreeReader = reader.ReadSubtree();
                        if (HandleElement(reader, writer))
                        {
                            ReadToEnd(subTreeReader);
                        }
                        else
                        {
                            writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
                            writer.WriteAttributes(reader, true);
                            if (reader.IsEmptyElement)
                            {
                                writer.WriteEndElement();
                            }
                        }
                        break;
                    case XmlNodeType.Text:
                        writer.WriteString(reader.Value);
                        break;
                    case XmlNodeType.Whitespace:
                    case XmlNodeType.SignificantWhitespace:
                        writer.WriteWhitespace(reader.Value);
                        break;
                    case XmlNodeType.CDATA:
                        writer.WriteCData(reader.Value);
                        break;
                    case XmlNodeType.EntityReference:
                        writer.WriteEntityRef(reader.Name);
                        break;
                    case XmlNodeType.XmlDeclaration:
                    case XmlNodeType.ProcessingInstruction:
                        writer.WriteProcessingInstruction(reader.Name, reader.Value);
                        break;
                    case XmlNodeType.DocumentType:
                        writer.WriteDocType(reader.Name, reader.GetAttribute("PUBLIC"), reader.GetAttribute("SYSTEM"), reader.Value);
                        break;
                    case XmlNodeType.Comment:
                        writer.WriteComment(reader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        writer.WriteFullEndElement();
                        break;
                }
            }
        }
    }

    private static void ReadToEnd(XmlReader reader)
    {
        while (!reader.EOF)
        {
            reader.Read();
        }
    }

    private static bool HandleElement(XmlReader reader, XmlWriter writer)
    {
        if (reader.Name == "e")
        {
            writer.WriteElementString("element", "val1");
            return true;
        }

        return false;
    }
}
;