2012-01-19 2 views
14

Ho il seguente codice:Perché il mio XDocument sta salvando la dichiarazione quando non lo desidero?

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

Io sto cercando di ottenere XML per salvare senza la dichiarazione XML, ma anche se sto nulling la dichiarazione del XDocument, è ancora in corso il salvataggio XML finale .

Questo codice è l'output:

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

Perché si desidera salvare un documento XML senza la dichiarazione? È utile includere una dichiarazione che specifica la codifica e la versione del documento XML per gli utenti del file XML. –

+0

Poiché questo XML viene inviato ad altri sistemi in-house che apparentemente si rompono se si ha la dichiarazione xml (e non ho alcun controllo su quei sistemi, è un altro intero reparto) – KallDrexx

+0

che è abbastanza giusto :) Mi chiedevo solo perché –

risposta

13

Invece XDocument.Save() è possibile utilizzare XmlWriter con XmlWriterSettings.OmitXmlDeclaration set per 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 non riesci a trovare questo metodo, puoi fornire un link a 'MSDN'? – gdoron

+0

Ti ho fornito un esempio veloce, vedi risposta aggiornata – sll

+1

Grazie fantastici! – KallDrexx

7

È possibile farlo utilizzando XmlWriter con un costume XmlWriterSettings (ti bisogno di una direttiva using per 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); 
      } 
     } 
    } 
} 

Questo è supponendo che si desidera specificare la Stream - è anche possibile creare un XmlWriter dal nome del file:

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

(Se non è necessario il XDocument per qualsiasi altra cosa, si può chiamare Save su l'elemento principale, ovviamente, allo stesso modo.)

+1

EDIT: se NON si usa il codice di Jon, aggiunge ancora la dichiarazione come il metodo 'XDocument.Save' chiama il metodo' XNode.GetXmlWriterSettings', che restituisce un nuovo oggetto 'XmlWriterSettings', che ha OmitXmlDeclaration' impostato su false di default –

+0

@JamesShuttler: Il codice sopra * non * scrive la dichiarazione per me. L'hai provato e hai scoperto che lo ha fatto? –

+0

Perché si costruisce il corpo 'XML' in' XElement' e quindi lo si inserisce in 'XDocument'. Invece di costruire l'intero 'XML' con' XDocument'? – gdoron