Почему мой XDocument сохраняет объявление, когда я этого не хочу? - PullRequest
15 голосов
/ 19 января 2012

У меня есть следующий код:

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>

Ответы [ 2 ]

14 голосов
/ 19 января 2012

Вместо XDocument.Save() вы можете использовать XmlWriter с 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);
}
7 голосов
/ 19 января 2012

Вы можете сделать это, используя XmlWriter с пользовательским XmlWriterSettings (вам понадобится директива using для System.Xml):

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 для корневого элемента, конечно, таким же образом.)

...