格式化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();
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章