如何格式化XElement对象的内容?
我知道在调用.ToString()时输出字符串会自动格式化,但我想在将对象转换为字符串之前添加空白节点。
目的是格式化由Microsoft.VisualStudio.XmlEditor类生成的模型中的XML节点。
答案 0 :(得分:2)
将文本添加为子元素(存储为XText):
string xml = "<a><b>b</b></a>";
XElement xdoc = XElement.Parse(xml);
var b = xdoc.Element("b");
b.AddBeforeSelf(" ");
b.AddAfterSelf(new XText(" "));
b.Add(" ");
b.AddFirst(" ");
Console.WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));
通用格式化示例(任何xml):
string xml = "<a><b a=\"a\"><c><d>d</d></c></b><b a=\"a\"><c><d>d</d></c></b><e b=\"b\" a=\"a\"><f>f</f></e></a>";
XElement xdoc = XElement.Parse(xml);
Format(xdoc, 0);
Console.WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));
static void Format(XElement x, int level)
{
foreach (var x1 in x.Elements())
Format(x1, level + 1);
if (level > 0)
{
x.AddBeforeSelf(Environment.NewLine + new string(' ', 2 * level));
if (x.Parent.LastNode == x)
{
string ending = Environment.NewLine;
if (level > 1)
ending += new string(' ', 2 * (level - 1));
x.AddAfterSelf(ending);
}
}
}