【问题标题】:How do you create an indented XML string from an XDocument in c#?如何在 C# 中从 XDocument 创建缩进的 XML 字符串?
【发布时间】:2010-03-03 20:22:58
【问题描述】:

我有一个 XDocument 对象,并且 ToString() 方法返回没有任何缩进的 XML。如何从这个包含缩进的 XML 中创建一个字符串?

编辑:我在问如何创建内存中的字符串而不是写出文件。

编辑:看起来我在这里不小心问了一个技巧问题... ToString() 确实返回缩进的 XML。

【问题讨论】:

  • 你能发布你的代码吗?我可以让 XDocument.ToString 不缩进 XML 的唯一方法是当我明确地将 SaveOptions.DisableFormatting 传递给 ToString 方法时。
  • 我在这里尝试了答案。它们没有效果(仍然使用空格)。使用 .Net 4(不是客户端)。

标签: c# linq-to-xml


【解决方案1】:
XDocument doc = XDocument.Parse(xmlString);
string indented = doc.ToString();

【讨论】:

  • 这很好用。 XDocument.ToString() 格式默认带有缩进。要获得未格式化的输出,您必须通过调用 .ToString(SaveOptions.DisableFormatting)
  • 我实际上是在寻找禁用。谢谢@JoelMueller
【解决方案2】:

来自here

XmlDocument doc = new XmlDocument();
doc.LoadXml("<item><name>wrench</name></item>");

// Save the document to a file and auto-indent the output.
XmlTextWriter writer = new XmlTextWriter("data.xml",null);
writer.Formatting = Formatting.Indented;
doc.Save(writer);

【讨论】:

  • 问题是如何创建字符串,而不是如何创建文件。
  • @JC:在 XmlTextWriter 的构造函数中使用 StringWriter 而不是文件名来获取字符串。
  • -1:不要使用 new XmlTextWriter()new XmlTextReader() 过去的 .NET 1.1。使用XmlWriter.Create()XmlReader.Create()
【解决方案3】:

同样的汤再多一种味道... ;-)

StringWriter sw = new StringWriter();
XmlTextWriter xw = new XmlTextWriter(sw);
xw.Formatting = Formatting.Indented;
doc.WriteTo(xw);
Console.WriteLine(sw.ToString());

编辑:感谢John Saunders。这是一个更符合Creating XML Writers on MSDN的版本。

using System;
using System.Text;
using System.Xml;
using System.Xml.Linq;

class Program
{
    static void Main(string[] args)
    {
        XDocument doc = new XDocument(
        new XComment("This is a comment"),
        new XElement("Root",
            new XElement("Child1", "data1"),
            new XElement("Child2", "data2")
            )
            );

        var builder = new StringBuilder();
        var settings = new XmlWriterSettings()
        {
            Indent = true
        };
        using (var writer = XmlWriter.Create(builder, settings))
        {
            doc.WriteTo(writer);
        }
        Console.WriteLine(builder.ToString());
    }
}

【讨论】:

  • 我更喜欢这个,但你的用途在哪里?!
  • -1:不要在 .NET 1.1 之后使用 new XmlTextWriter() 或 new XmlTextReader()。使用 XmlWriter.Create() 或 XmlReader.Create()
【解决方案4】:

要使用 XDocument(而不是 XmlDocument)创建字符串,您可以使用:

        XDocument doc = new XDocument(
            new XComment("This is a comment"),
            new XElement("Root",
                new XElement("Child1", "data1"),
                new XElement("Child2", "data2")
            )
        );

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        StringBuilder sb = new StringBuilder();
        using (XmlWriter writer = XmlTextWriter.Create(sb, settings)) {
            doc.WriteTo(writer);
            writer.Flush();
        }
        string outputXml = sb.ToString();

编辑:更新为使用 XmlWriter.CreateStringBuilder 以及良好的形式 (using)。

【讨论】:

  • -1:不要使用新的 XmlTextWriter() 或新的 XmlTextReader() 超过 .NET 1.1。使用 XmlWriter.Create() 或 XmlReader.Create()
  • 谢谢,我错过了。我相应地更新了示例(同时使用 StringBuilder 降低了复杂性!)
  • 仅供参考,在审查中,我仍然想保留我的反对意见,因为你没有使用 using 块。
  • @JohnSaunders:再次感谢并再次更新。我怀疑我最初试图专注于基本行为,但草率的样本往往会在其他地方出现草率的代码。
猜你喜欢
  • 2011-05-30
  • 2012-11-07
  • 2011-02-26
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多