public static string Format(string xml) { var ret = new StringWriter(); using (var escaper = new HtmlEscapingTextWriter(ret)) using (var source = new StringReader(xml)) using (var reader = XmlReader.Create(source)) using (var writer = new BufferedWriter()) { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: ret.Write(@"<span class=""keyword""><</span>"); writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); writer.WriteAttributes(reader, true); if (reader.IsEmptyElement) { writer.WriteEndElement(); } writer.Flush(); break; case XmlNodeType.Text: writer.WriteString(reader.Value); writer.Flush(); break; case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: writer.WriteWhitespace(reader.Value); writer.Flush(); break; case XmlNodeType.CDATA: writer.WriteCData(reader.Value); writer.Flush(); break; case XmlNodeType.EntityReference: writer.WriteEntityRef(reader.Name); writer.Flush(); break; case XmlNodeType.XmlDeclaration: case XmlNodeType.ProcessingInstruction: writer.WriteProcessingInstruction(reader.Name, reader.Value); writer.Flush(); break; case XmlNodeType.DocumentType: writer.WriteDocType(reader.Name, reader.GetAttribute("PUBLIC"), reader.GetAttribute("SYSTEM"), reader.Value); writer.Flush(); break; case XmlNodeType.Comment: writer.WriteComment(reader.Value); writer.Flush(); break; case XmlNodeType.EndElement: writer.WriteFullEndElement(); writer.Flush(); break; } } } }