2012-01-19 22 views
14

tengo el siguiente código:¿Por qué mi XDocument guarda la declaración cuando yo no la quiero?

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

Estoy tratando de obtener XML para salvar sin la declaración XML, pero a pesar de que estoy de anulación a cabo la declaración de la XDocument, todavía se está guardando en el XML definitiva .

Este código está emitiendo:

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

¿Por qué desea guardar un documento XML sin la declaración? Es útil incluir una declaración que especifique la codificación y la versión del documento XML para los consumidores del archivo XML. –

+0

Debido a que este XML se envía a otros sistemas de la compañía que aparentemente se rompen si tiene la declaración xml (y no tengo control sobre esos sistemas, es otro departamento completo) – KallDrexx

+0

eso es justo :) Me pregunto por qué –

Respuesta

13

lugar XDocument.Save() puede utilizar XmlWriter con XmlWriterSettings.OmitXmlDeclaration conjunto de 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 no puede encontrar este método, ¿puede dar un enlace a 'MSDN'? – gdoron

+0

He proporcionado un ejemplo rápido para usted, vea la respuesta actualizada – sll

+1

Awesome thanks! – KallDrexx

7

Usted puede hacer esto utilizando XmlWriter con una costumbre XmlWriterSettings (te necesita una directiva using para 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); 
      } 
     } 
    } 
} 

Eso suponiendo que desea especificar el Stream - también se puede crear un XmlWriter del nombre del archivo:

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

(Si no necesita el XDocument para nada más, sólo puede llamar a Save en el elemento raíz, por supuesto, de la misma manera.)

+1

EDITAR: si NO utiliza el código de Jon, agrega la declaración ya que el método 'XDocument.Save' llama al método' XNode.GetXmlWriterSettings', que luego devuelve un nuevo objeto 'XmlWriterSettings', que tiene' OmitXmlDeclaration' establecido en falso de forma predeterminada –

+0

@JamesShuttler: el código anterior * no * escribe la declaración para mí. ¿Lo intentaste y descubriste que sí? –

+0

¿Por qué construye el cuerpo 'XML' en' XElement' y luego lo inserta en 'XDocument'. En lugar de construir todo el 'XML' con' XDocument'? – gdoron

Cuestiones relacionadas