C# 为什么我的XDocument在我没有';我不想这样?

C# 为什么我的XDocument在我没有';我不想这样?,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有以下代码: class Program { static void Main(string[] args) { using (var stream = File.Create(@"C:\test.xml")) { var xml = new XElement("root", new XElement("subelement1", "1"),

我有以下代码:

class Program
{
    static void Main(string[] args)
    {
        using (var stream = File.Create(@"C:\test.xml"))
        {
            var xml =
                new XElement("root",
                    new XElement("subelement1", "1"),
                    new XElement("subelement2", "2"));

            var doc = new XDocument(xml);
            doc.Declaration = null;
            doc.Save(stream);
        }
    }
}
我试图在不使用XML声明的情况下保存XML,但即使我取消了
XDocument
的声明,它仍然保存到最终的XML中

此代码正在输出:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <subelement1>1</subelement1>
  <subelement2>2</subelement2>
</root>

1.
2.

而不是
XDocument.Save()
您可以将
XmlWriter
XmlWriterSettings一起使用。省略xmldeclaration
设置为
true

using System.IO;
using System.Xml;
using System.Xml.Linq;

XmlWriterSettings xws = new XmlWriterSettings();
xws.OmitXmlDeclaration = true;
xws.Indent = true;

using (var stream = File.Create(@"C:\test.xml"))
using (XmlWriter xw = XmlWriter.Create(stream, xws))
{
    var xml = new XElement(
        "root",
        new XElement("subelement1", "1"),
        new XElement("subelement2", "2"));

    xml.Save(xw);
}
您可以使用带有自定义项的
XmlWriter
执行此操作(您需要
System.Xml
的using指令):

假设您要指定
——您还可以从文件名创建
XmlWriter

using (var writer = XmlWriter.Create("test.xml", settings))
{
    doc.Save(writer);
}

(如果您不需要
XDocument
来做任何其他事情,您可以用同样的方式在根元素上调用
Save

我找不到这个方法,请您提供一个指向
MSDN
的链接。为什么您希望保存一个没有声明的XML文档?包含一个声明非常有用,该声明为XML文件的使用者指定XML文档的编码和版本。因为此XML被发送到其他公司内系统,如果您有XML声明,这些系统显然会崩溃(我无法控制这些系统,这是另一个完整的部门)这很公平:)我只是想知道为什么编辑:如果不使用Jon的代码,那么它仍然将声明添加为
XDocument.Save
方法调用
XNode.GetXmlWriterSettings
方法,然后返回一个新的
XmlWriterSettings
对象,已将
ommitXMLDeclaration
设置为false的default@JamesShuttler:上面的代码没有为我编写声明。你试过了吗?为什么要在
XElement
中构建
XML
主体,然后将其插入
XDocument
。而不是用
XDocument
构建整个
XML
?@gdoron:OP的代码就是这样做的。我只更改了保存部分。@JonSkeet很抱歉我不清楚,您的代码没有编写XML声明,这是正确的。你说你不确定为什么它仍然添加声明,即使它在海报代码中被明确删除。我解释了为什么如果您不使用您提供的代码,它仍然会被添加
using (var writer = XmlWriter.Create("test.xml", settings))
{
    doc.Save(writer);
}