C# 格式化XElement对象

C# 格式化XElement对象,c#,xml,xelement,C#,Xml,Xelement,如何格式化XElement对象的内容 我知道在调用.ToString()时输出字符串会自动格式化,但我想在将对象转换为字符串之前添加空白节点 其目的是格式化由Microsoft.VisualStudio.XmlEditor类生成的模型中的XML节点。将文本添加为子元素(存储为XText): stringxml=“b”; XElement xdoc=XElement.Parse(xml); var b=xdoc.元素(“b”); b、 在自身之前添加(“”); b、 AddAfterSelf(新的

如何格式化XElement对象的内容

我知道在调用.ToString()时输出字符串会自动格式化,但我想在将对象转换为字符串之前添加空白节点

其目的是格式化由Microsoft.VisualStudio.XmlEditor类生成的模型中的XML节点。

将文本添加为子元素(存储为XText):

stringxml=“b”;
XElement xdoc=XElement.Parse(xml);
var b=xdoc.元素(“b”);
b、 在自身之前添加(“”);
b、 AddAfterSelf(新的XText(“”);
b、 加上(“”);
b、 添加第一个(“”);
WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));
通用格式化示例(任何xml):

stringxml=“ddf”;
XElement xdoc=XElement.Parse(xml);
格式(xdoc,0);
WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));
静态空心格式(像素x,整数级)
{
foreach(x.Elements()中的变量x1)
格式(x1,级别+1);
如果(级别>0)
{
x、 AddBeforeSelf(Environment.NewLine+新字符串(“”,2*level));
如果(x.Parent.LastNode==x)
{
字符串结尾=Environment.NewLine;
如果(级别>1)
结尾+=新字符串(“”,2*(级别-1));
x、 AddAfterSelf(结束);
}
}
}
将文本添加为子元素(存储为XText):

stringxml=“b”;
XElement xdoc=XElement.Parse(xml);
var b=xdoc.元素(“b”);
b、 在自身之前添加(“”);
b、 AddAfterSelf(新的XText(“”);
b、 加上(“”);
b、 添加第一个(“”);
WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));
通用格式化示例(任何xml):

stringxml=“ddf”;
XElement xdoc=XElement.Parse(xml);
格式(xdoc,0);
WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));
静态空心格式(像素x,整数级)
{
foreach(x.Elements()中的变量x1)
格式(x1,级别+1);
如果(级别>0)
{
x、 AddBeforeSelf(Environment.NewLine+新字符串(“”,2*level));
如果(x.Parent.LastNode==x)
{
字符串结尾=Environment.NewLine;
如果(级别>1)
结尾+=新字符串(“”,2*(级别-1));
x、 AddAfterSelf(结束);
}
}
}

你能给我们看你的代码吗?你叫什么空白节点?以空白为内容的XText对象。你能给我们看你的代码吗?你叫什么空白节点?以空白为内容的XText对象。我想在XElement对象本身而不是字符串输出中添加空白。XElement不存储空白。它不是一根弦。它存储标记的内容(内部…),属性的内容,但不存储之前或之后的内容。请不要给人负面的印象。谢谢)只需在xelement上按F12,然后查看声明。它有名称、值属性、Attributes()方法。没有空格属性。我知道,但是XElement可以有XText子对象,以空格作为内容。你是对的。xelement在子元素中可以有任何xnode。更新的答案。我想在XElement对象本身中添加空白,而不是字符串输出。XElement不存储空白。它不是一根弦。它存储标记的内容(内部…),属性的内容,但不存储之前或之后的内容。请不要给人负面的印象。谢谢)只需在xelement上按F12,然后查看声明。它有名称、值属性、Attributes()方法。没有空格属性。我知道,但是XElement可以有XText子对象,以空格作为内容。你是对的。xelement在子元素中可以有任何xnode。更新答案。
   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));
   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);
            }
        }
    }