【问题标题】:Format XElement object格式化 XElement 对象
【发布时间】:2016-03-25 14:11:15
【问题描述】:

如何格式化 XElement 对象的内容?

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

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

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 什么叫空白节点
  • 以空格为内容的 XText 对象。

标签: c# xml xelement


【解决方案1】:

将文本添加为​​子元素(存储为 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);
            }
        }
    }

【讨论】:

  • 我想在 XElement 对象本身中添加空格,而不是字符串输出。
  • xelement 不存储空格。它不是一个字符串。它存储标签的内容(在...> 内)、属性的内容,但不是 之前或之后的内容。请不要给予负面声誉。谢谢)
  • 只需在 xelement 上按 F12 并查看声明。它具有 Name、Value 属性、Attributes() 方法。没有 Whitespace 属性。
  • 我知道,但是 XElement 可以有 XText 子对象,以空格作为内容。
  • 你是对的。 xelement 可以在子元素中具有任何 xnode。更新的答案。
猜你喜欢
  • 1970-01-01
  • 2015-07-06
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多