2010-03-03 6 views
21

J'ai un objet XDocument et la méthode ToString() renvoie le code XML sans aucune indentation. Comment puis-je créer une chaîne à partir de ce XML contenant indenté?Comment créer une chaîne XML indentée à partir d'un XDocument dans C#?

edit: Je demande comment créer une chaîne en mémoire plutôt que d'écrire dans un fichier.

edit: On dirait que j'ai demandé par hasard une question piège ici ... ToString() retourne un XML indenté.

+0

Pouvez-vous envoyer votre code? La seule façon d'obtenir XDocument.ToString pour ne pas indenter le XML est quand je passe explicitement dans SaveOptions.DisableFormatting à la méthode ToString. –

+0

J'ai essayé les réponses ici. Ils n'ont eu aucun effet (utilise toujours des espaces). En utilisant .Net 4 (pas client). –

+0

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

Répondre

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

Cela fonctionne très bien. 'XDocument.ToString()' formats avec indentation par défaut. Pour obtenir une sortie non formatée, vous devez sortir de votre chemin en appelant '.ToString (SaveOptions.DisableFormatting)' –

+1

Je cherchais en fait à désactiver. Merci @ 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 question est de savoir comment créer une chaîne, pas comment créer un fichier. –

+1

@JC: Utilisez un StringWriter au lieu du nom de fichier dans le constructeur de XmlTextWriter pour obtenir une chaîne. –

+1

-1: N'utilisez pas 'new XmlTextWriter()' ou 'new XmlTextReader()' passé .NET 1.1. Utilisez 'XmlWriter.Create()' ou 'XmlReader.Create()'. –

2

Pour créer une chaîne à l'aide d'un XDocument (plutôt que d'un XmlDocument), vous pouvez utiliser:

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

Edit: Mise à jour à utiliser XmlWriter.Create et un StringBuilder et bonne forme (using).

+1

-1: N'utilisez pas le nouveau XmlTextWriter() ou le nouveau XmlTextReader() passé .NET 1.1. Utilisez XmlWriter.Create() ou XmlReader.Create() –

+1

Merci, j'avais raté ça. J'ai mis à jour l'échantillon en conséquence (et réduit la complexité avec un StringBuilder en même temps!) – DocMax

+0

FYI, sur examen, je veux toujours garder ma downvote parce que vous n'avez pas utilisé un bloc 'using'. –

7

Encore une saveur de la même soupe ... ;-)

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

Edit: Merci à John Saunders. Voici une version qui devrait mieux se conformer à 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

Préférez cela à la mienne, mais où sont vos utilisations?! – tomfanning

+1

-1: N'utilisez pas le nouveau XmlTextWriter() ou le nouveau XmlTextReader() passé .NET 1.1. Utilisez XmlWriter.Create() ou XmlReader.Create() –

Questions connexes