2012-01-19 4 views
14

У меня есть следующий код:Почему мой XDocument сохраняет декларацию, когда я этого не хочу?

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> 
+0

Почему вы хотите сохранить XML-документ без декларации? Полезно включить объявление, которое указывает кодировку и версию XML-документа для пользователей XML-файла. –

+0

Поскольку этот XML отправляется в другие системы внутри компании, которые, по-видимому, ломаются, если у вас есть объявление xml (и у меня нет контроля над этими системами, это еще один целый отдел) – KallDrexx

+0

это достаточно справедливо :) Мне просто интересно, почему –

ответ

13

Вместо 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); 
} 
+1

I не можете найти этот метод, не могли бы вы дать ссылку на «MSDN»? – gdoron

+0

Я предоставил вам быстрый пример, см. Обновленный ответ – sll

+1

Удивительное спасибо! – KallDrexx

7

Вы можете сделать это с помощью XmlWriter с обычаем XmlWriterSettings (вы необходимо использовать директиву для 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 на корневой элемент, конечно, таким же образом.)

+1

EDIT: если вы НЕ используете код Джона, то он все равно добавляет объявление, поскольку метод 'XDocument.Save' вызывает метод' XNode.GetXmlWriterSettings', который затем возвращает новый объект 'XmlWriterSettings', который имеет' OmitXmlDeclaration', установленный для false по умолчанию –

+0

@JamesShuttler: вышеприведенный код * не * записывает декларацию для меня. Вы попробовали это и обнаружили, что это так? –

+0

Почему вы создаете тело 'XML' в' XElement', а затем вставляете его в 'XDocument'. Вместо того, чтобы строить весь «XML» с помощью «XDocument»? – gdoron

Смежные вопросы