为什么我的XDocument保存声明而我不想要它?

17

我有以下代码:

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>

为什么你想要保存一个没有声明的XML文档呢?在XML文件的消费者中包含指定编码和版本的声明是有用的。 - James Shuttler
因为这个XML将被发送到公司内的其他系统,如果你有XML声明,这些系统显然会出现问题(而我无法控制这些系统,那是另一个完整的部门)。 - KallDrexx
那很公平 :) 我只是想知道为什么。 - James Shuttler
2个回答

17

你可以使用XmlWriter代替XDocument.Save(),并将XmlWriterSettings.OmitXmlDeclaration设置为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);
}

1
我找不到这个方法,你能给一个 MSDN 的链接吗? - gdoron

9

您可以使用自定义的XmlWriterSettings(需要为System.Xml添加using指令)来使用XmlWriter完成此操作:

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

class Program
{
    static void Main(string[] args)
    {
        var xml =
            new XElement("root",
                         new XElement("subelement1", "1"),
                         new XElement("subelement2", "2"));

        var doc = new XDocument(xml);
        var settings = new XmlWriterSettings
        {
            OmitXmlDeclaration = true
        };
        using (var stream = File.Create(@"test.xml"))
        {
            using (var writer = XmlWriter.Create(stream, settings))
            {
                doc.Save(writer);
            }
        }
    }
}

假设您想指定Stream,您还可以从文件名创建一个XmlWriter

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

如果你不需要XDocument做其他事情,当然可以直接在根元素上调用Save方法。


1
如果您不使用Jon的代码,则仍会添加声明,因为XDocument.Save方法调用XNode.GetXmlWriterSettings方法,该方法返回一个新的XmlWriterSettings对象,默认情况下将OmitXmlDeclaration设置为false。 - James Shuttler
@JamesShuttler:上面的代码并没有为我编写声明。你试过了吗?发现它确实这样做了吗? - Jon Skeet
为什么要在XElement中构建XML主体,然后将其插入到XDocument中,而不是使用XDocument构建整个XML - gdoron
@gdoron:这就是原帖的代码所做的。我仅仅改变了保存部分。 - Jon Skeet
1
@JonSkeet 抱歉我表达不够清楚,你的代码确实没有写入XML声明。你说你不确定为什么即使在发布者的代码中明确删除了声明,它仍然会被添加。我解释了如果您不使用您提供的代码,为什么仍然会添加声明。 - James Shuttler
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接