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"">&lt;</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;
                                }
                            }
                        }
        }
        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"">&lt;</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;
                    }
                }
            }
        }