格式化XML:输出有缩进效果的XML字符串

1. 一般情况下使用以下代码即可将XML字符串重新格式化:
        private string FormatXml(string source)
        {
            StringBuilder sb 
= new StringBuilder();
            XmlTextWriter writer 
= null;
            
            
try
            {
                XmlDocument doc 
= new XmlDocument();
                doc.LoadXml(source);

                writer 
= new XmlTextWriter(new StringWriter(sb));
                writer.Formatting 
= Formatting.Indented;
                
                doc.WriteTo(writer);
            }
            
finally
            {
                
if (writer != null) writer.Close();
            }

            
return sb.ToString();
        }

2. 在某些情况下如果需要对XML代码中的Attribute也应用缩进样式,这个时候可以通过重写XMLTextWriter类的WriteStartAttribute方法来实现:
using System.IO;
using System.Text;
using System.Xml;

namespace Test
{
    
public class XmlReformatter : XmlTextWriter
    {
        
private XmlReader xr;

        
private readonly StringWriter sw;

        
public XmlReformatter(StringWriter sw) : base(sw)
        {
            
this.sw = sw;
        }

        
public override void WriteStartAttribute(string prefix, string localName, string ns)
        {
            StringBuilder sb 
= new StringBuilder("\r\n");

            
int i = xr.Depth;

            
for (i *= Indentation; i > 0; i--) sb.Append(IndentChar);

            sw.Write(sb.ToString());

            
base.WriteStartAttribute(prefix, localName, ns);
        }

        
public override void WriteNode(XmlReader reader, bool defattr)
        {
            xr 
= reader;
            
base.WriteNode(reader, defattr);
        }
    }
}

调用示例:
        private string FormatXmlAttribute(string source)
        {
            StringBuilder sb 
= new StringBuilder();

            XmlTextReader tr 
= new XmlTextReader(new StringReader(source));

            XmlReformatter formatter 
= new XmlReformatter(new StringWriter(sb));
            formatter.Formatting 
= Formatting.Indented;
            formatter.WriteNode(tr, 
true);
            formatter.Flush();
            formatter.Close();

            tr.Close();

            
return sb.ToString();
        }

posted on 2007-08-22 15:46  Shadower  阅读(1268)  评论(1)    收藏  举报

导航