2010-03-03 11 views
21

Tengo un objeto XDocument y el método ToString() devuelve XML sin ninguna sangría. ¿Cómo creo una cadena a partir de esto que contiene un sangrado XML?¿Cómo se crea una cadena XML con sangría de un XDocument en C#?

editar: Estoy preguntando cómo crear una cadena en memoria en lugar de escribir en un archivo.

editar: Parece que hice una pregunta trucada accidentalmente aquí ... ToString() devuelve sangría XML.

+0

Se puede publicar su código? La única forma en que puedo hacer que XDocument.ToString NO sangre con el XML es cuando paso explícitamente SaveOptions.DisableFormatting al método ToString. –

+0

He intentado las respuestas aquí. No tuvieron ningún efecto (aún usan espacios). Usando .Net 4 (no cliente). –

+0

Relacionados: http://stackoverflow.com/questions/1123718/format-xml-string-to-print-friendly-xml-string – CJBS

Respuesta

19
XDocument doc = XDocument.Parse(xmlString); 
string indented = doc.ToString(); 
+9

Esto funciona bien. Formatos 'XDocument.ToString()' con sangría por defecto. Para obtener un resultado sin formato, debe salir de su camino al llamar a '.ToString (SaveOptions.DisableFormatting)' –

+1

Estaba buscando la desactivación. Gracias @JoelMueller – Eric

9

De here

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<item><name>wrench</name></item>"); 

// Save the document to a file and auto-indent the output. 
XmlTextWriter writer = new XmlTextWriter("data.xml",null); 
writer.Formatting = Formatting.Indented; 
doc.Save(writer); 
+0

La pregunta es cómo crear una cadena, no cómo crear un archivo. –

+1

@JC: utilice un StringWriter en lugar del nombre de archivo en el constructor de XmlTextWriter para obtener una cadena. –

+1

-1: No use 'new XmlTextWriter()' o 'new XmlTextReader()' pasado .NET 1.1. Use 'XmlWriter.Create()' o 'XmlReader.Create()'. –

2

para crear una cadena utilizando un XDocument (en lugar de un XmlDocument), puede utilizar:

 XDocument doc = new XDocument(
      new XComment("This is a comment"), 
      new XElement("Root", 
       new XElement("Child1", "data1"), 
       new XElement("Child2", "data2") 
      ) 
     ); 

     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Indent = true; 
     StringBuilder sb = new StringBuilder(); 
     using (XmlWriter writer = XmlTextWriter.Create(sb, settings)) { 
      doc.WriteTo(writer); 
      writer.Flush(); 
     } 
     string outputXml = sb.ToString(); 

Editar: actualizado para utilizar XmlWriter.Create y una StringBuilder y buena forma (using).

+1

-1: No utilice el nuevo XmlTextWriter() o el nuevo XmlTextReader() pasado .NET 1.1. Use XmlWriter.Create() o XmlReader.Create() –

+1

Gracias, me había perdido eso. Actualicé la muestra en consecuencia (¡y reduje la complejidad con StringBuilder al mismo tiempo!) – DocMax

+0

FYI, en revisión, aún quiero mantener mi voto negativo porque no usaste un bloque 'using'. –

7

Sólo un sabor más de la misma sopa ... ;-)

StringWriter sw = new StringWriter(); 
XmlTextWriter xw = new XmlTextWriter(sw); 
xw.Formatting = Formatting.Indented; 
doc.WriteTo(xw); 
Console.WriteLine(sw.ToString()); 

Editar: gracias a John Saunders. Aquí hay una versión que debería ajustarse mejor al Creating XML Writers on MSDN.

using System; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     XDocument doc = new XDocument(
     new XComment("This is a comment"), 
     new XElement("Root", 
      new XElement("Child1", "data1"), 
      new XElement("Child2", "data2") 
      ) 
      ); 

     var builder = new StringBuilder(); 
     var settings = new XmlWriterSettings() 
     { 
      Indent = true 
     }; 
     using (var writer = XmlWriter.Create(builder, settings)) 
     { 
      doc.WriteTo(writer); 
     } 
     Console.WriteLine(builder.ToString()); 
    } 
} 
+3

Prefiero esto al mío, pero ¿dónde están tus usos? – tomfanning

+1

-1: No utilice XmlTextWriter() nuevo o XmlTextReader() pasado .NET 1.1. Use XmlWriter.Create() o XmlReader.Create() –

Cuestiones relacionadas