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();
}