2012-01-19 12 views
14

Mam następujący kod:Dlaczego mój XDocument zapisuje deklarację, kiedy jej nie chcę?

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); 
     } 
    } 
} 

Próbuję dostać XML, aby zapisać bez deklaracji XML, ale chociaż jestem Nulling się deklarację XDocument, to wciąż jest zapisany do końcowego XML .

Ten kod jest wyprowadzanie:

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

Dlaczego chcesz zapisać dokument XML bez deklaracji? Warto dołączyć deklarację, która określa kodowanie i wersję dokumentu XML dla konsumentów pliku XML. –

+0

Ponieważ ten kod XML jest wysyłany do innych systemów wewnątrz firmy, które najwyraźniej ulegają uszkodzeniu, jeśli posiadasz deklarację xml (i nie mam kontroli nad tymi systemami, to jest to cały inny dział) – KallDrexx

+0

To jest w porządku. Po prostu zastanawiałem się, dlaczego –

Odpowiedz

13

Zamiast XDocument.Save() można użyć XmlWriter z XmlWriterSettings.OmitXmlDeclaration zestaw do 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 nie możesz znaleźć tej metody, czy możesz podać link do 'MSDN'? – gdoron

+0

Dostarczyłem Ci szybki przykład, zobacz zaktualizowaną odpowiedź – sll

+1

Niesamowite dzięki! – KallDrexx

7

Ty może zrobić przy użyciu XmlWriter ze zwyczajem XmlWriterSettings (będziesz potrzebujesz dyrektywy dotyczącej używania dla 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); 
      } 
     } 
    } 
} 

Zakładając chcesz określić Stream - można także utworzyć XmlWriter z nazwy pliku:

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

(Jeśli nie potrzebujesz XDocument do niczego innego, można po prostu zadzwonić Save na element główny, oczywiście, w ten sam sposób.)

+1

EDYCJA: jeśli NIE używasz kodu Jona, to dodaje on deklarację, ponieważ metoda 'XDocument.Save' wywołuje metodę' XNode.GetXmlWriterSettings', która zwraca nowy obiekt 'XmlWriterSettings', który ma ustawiony parametr' OmitXmlDeclaration' domyślnie false –

+0

@JamesShuttler: Powyższy kod * nie * zapisz dla mnie deklaracji. Spróbowałeś i okazało się, że tak? –

+0

Dlaczego budujesz ciało 'XML' w' XElement', a następnie wstawiasz je do 'XDocument'. Zamiast budować cały "XML" z 'XDocument'? – gdoron

Powiązane problemy