如何从c#中的XDocument创建缩进XML字符串?

如何从c#中的XDocument创建缩进XML字符串?,c#,linq-to-xml,C#,Linq To Xml,我有一个XDocument对象,ToString()方法返回XML而不进行任何缩进。如何从这个包含缩进XML的字符串中创建字符串 编辑:我问的是如何创建内存中的字符串,而不是将其写入文件 编辑:看起来我不小心问了个问题。。。ToString()确实返回缩进的XML。From XmlDocument doc=新的XmlDocument(); doc.LoadXml(“扳手”); //将文档保存到文件并自动缩进输出。 XmlTextWriter=newXMLTextWriter(“data.xml”

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

编辑:我问的是如何创建内存中的字符串,而不是将其写入文件

编辑:看起来我不小心问了个问题。。。ToString()确实返回缩进的XML。

From

XmlDocument doc=新的XmlDocument();
doc.LoadXml(“扳手”);
//将文档保存到文件并自动缩进输出。
XmlTextWriter=newXMLTextWriter(“data.xml”,null);
writer.Formatting=格式化.缩进;
保存文档(编写器);

要使用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。创建
StringBuilder
以及良好的形式(
使用
)。

只需再来一种味道相同的汤…;-)

编辑:谢谢。这里有一个版本,应该更好地符合


问题是如何创建字符串,而不是如何创建文件。@JC:使用StringWriter而不是XmlTextWriter构造函数中的文件名来获取字符串。-1:不要使用
new XmlTextWriter()
new XmlTextReader()
past.NET 1.1。使用
XmlWriter.Create()
XmlReader.Create()
。比起我的,你更喜欢这个,但你的用法在哪里-1:不要在.NET 1.1之前使用新的XmlTextWriter()或新的XmlTextReader()。使用XmlWriter.Create()或XmlReader.Create()-1:不要在.NET 1.1之前使用新的XmlTextWriter()或新的XmlTextReader()。使用XmlWriter.Create()或XmlReader.Create()谢谢,我错过了。我相应地更新了示例(同时降低了使用StringBuilder的复杂性!)仅供参考,在审阅时,我仍然希望保留我的否决票,因为您没有使用
使用
块。@JohnSaunders:再次感谢并再次更新。我怀疑我最初是想把重点放在基本行为上,但是草率的示例往往会在其他地方的草率代码中结束
XDocument.ToString()
默认设置缩进格式。要获得未格式化的输出,您必须通过调用
.ToString(SaveOptions.DisableFormatting)
来实现。谢谢@joelmueller你能发布你的代码吗?让XDocument.ToString不缩进XML的唯一方法是显式地将SaveOptions.DisableFormatting传递给ToString方法。我在这里尝试了答案。它们没有效果(仍然使用空格)。使用.Net 4(非客户端)。相关:
        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();
StringWriter sw = new StringWriter();
XmlTextWriter xw = new XmlTextWriter(sw);
xw.Formatting = Formatting.Indented;
doc.WriteTo(xw);
Console.WriteLine(sw.ToString());
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());
    }
}
XDocument doc = XDocument.Parse(xmlString);
string indented = doc.ToString();