CSharp · Console
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;
}
}