2010-11-04 13 views
26

Estoy escribiendo algunos datos en un archivo XML ... pero cuando lo abro, todos los valores están en una sola línea ... ¿cómo puedo escribirlo en formato legible? Es decir, cada nodo en nueva línea y sangría?Sangría y nuevo comando de línea para XMLwriter en C#

FileStream fs = new FileStream("myfile.xml", FileMode.Create); 

XmlWriter w = XmlWriter.Create(fs); 

w.WriteStartDocument(); 
w.WriteStartElement("myfile");     

w.WriteElementString("id", id.Text); 
w.WriteElementString("date", dateTimePicker1.Text); 
w.WriteElementString("version", ver.Text); 
w.WriteEndElement(); 
w.WriteEndDocument(); 
w.Flush(); 
fs.Close(); 

Respuesta

37

Utilice un XmlTextWriter i en lugar de XmlWriter y luego configure las propiedades Indentation.

Ejemplo

string filename = "MyFile.xml"; 

using (FileStream fileStream = new FileStream(filename, FileMode.Create)) 
using (StreamWriter sw = new StreamWriter(fileStream)) 
using (XmlTextWriter xmlWriter = new XmlTextWriter(sw)) 
{ 
    xmlWriter.Formatting = Formatting.Indented; 
    xmlWriter.Indentation = 4; 

    // ... Write elements 
} 

siguiente comentario @jumbo, esto también podría implementarse como en .NET 2.

var filename = "MyFile.xml"; 
var settings = new XmlWriterSettings() 
{ 
    Indent = true, 
    IndentChars = " " 
} 

using (var w = XmlWriter.Create(filename, settings)) 
{ 
    // ... Write elements 
} 
+0

excepto que no se puede establecer la propiedad XmlSettings si es necesario –

+1

El uso de XmlTextWriter ya no se recomienda [https://msdn.microsoft.com/en-Us/library/system.xml.xmltextwriter (v = vs. 110) .aspx) (desde .Net2.0). Consulte [este control de calidad] (https://stackoverflow.com/questions/26075559/what-is-the-purpose-of-xmltextwriter-if-xmlwriter-is-the-recommended-one) para obtener más información. – jumbo

+0

@jumbo gracias por la sugerencia, es bueno saberlo. – Dennis

7

compruebe la configuración de la propiedad:

w.Settings.Indent = true; 

Editar: no se puede establecer directamente:

System.Xml.XmlWriter.Create("path", new System.Xml.XmlWriterSettings()) 
+0

excepción: La propiedad 'XmlWriterSettings.Indent' es de solo lectura y no se puede configurar –

+0

Mi error, debe usar el método "Crear" y pasarlo directamente; respuesta actualizada – jvenema

+1

No funciona para mí ..... – Afra

3

establecer la propiedad de formato de la XmlTextWriter:

TextWriter textWriter; 
var xmlTextWriter = new XmlTextWriter(textWriter); 
xmlTextWriter.Formatting = Formatting.Indented; 
+0

¿Qué versión de .NET (o ensamblado?) Es esta propiedad "' Formatting' "? Mi solución se dirige a 4.5.1 y no conoce ninguna propiedad de "Formato" en 'Xml (Text?) Writer'? – Zack

25

Es necesario crear primero un objeto XmlWriterSettings que especifica su hendidura, luego al crear su XmlWriter, pase el XmlWriterSettings después de su ruta.

Además, uso el bloque using para permitir que C# maneje la eliminación de mis recursos para que no tenga que preocuparme por perder recursos en una excepción.

{ 
    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings() 
    { 
    Indent = true, 
    IndentChars = "\t", 
    NewLineOnAttributes = true 
    }; 

    using (XmlWriter w= XmlWriter.Create("myfile.xml", xmlWriterSettings)) 
    { 
    w.WriteStartDocument(); 
    w.WriteStartElement("myfile"); 

    w.WriteElementString("id", id.Text); 
    w.WriteElementString("date", dateTimePicker1.Text); 
    w.WriteElementString("version", ver.Text); 
    w.WriteEndElement(); 
    w.WriteEndDocument(); 
    } 
} 
+1

Técnicamente, poner "' Sangría' "en verdadero es todo lo que necesita aquí para que el' Xml (Text?) Writer' emita nuevas líneas. – Zack

1

utilizan la configuración de la siguiente manera:

 XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Encoding = Encoding.UTF8; 
     settings.Indent = true; 

     using (MemoryStream memoryStream = new MemoryStream()) 
     using (XmlWriter xmlDoc = XmlWriter.Create(memoryStream, settings)){ 
     // logic here.. 
     } 

Esto te llevará a donde usted quiere, sin embargo, usted no tiene que utilizar MemoryStream, la parte importent es la configuración.

0

Una pequeña versión VB.NET utilizando XmlWriter más XmlWriterSettings directos a presentar:

Dim oSerializer As New XmlSerializer(GetType(MyType), New XmlRootAttribute("MyRootAttributeName")) 
Using oXmlWriter As XmlWriter = XmlWriter.Create("MyFilePath", New XmlWriterSettings With {.Indent = True}) //Default encoding is utf-8 
    oSerializer.Serialize(oXmlWriter, oInstanceOfMyType) 
    oXmlWriter.Flush() 
End Using 

Compruebe el mana para otros ajustes y archivo de opciones de sobrescritura pero esto es limpio y funciona como se esperaba en un montón de situaciones.

Cuestiones relacionadas