2010-03-03 2 views
21

Ich habe ein XDocument-Objekt und die ToString() -Methode gibt XML ohne Einrückung zurück. Wie erstelle ich eine Zeichenkette aus dieser mit eingerückten XML?Wie erstellen Sie eine eingerückte XML-Zeichenfolge aus einem XDocument in C#?

edit: Ich frage, wie man eine In-Memory-Zeichenfolge erstellen, anstatt in eine Datei zu schreiben.

edit: Sieht so aus, als hätte ich hier versehentlich eine Frage gestellt ... ToString() gibt eingerücktes XML zurück.

+0

Können Sie Ihren Code schreiben? Der einzige Weg, wie ich XDocument.ToString dazu bringen kann, den XML-Code NICHT einzurücken, ist, wenn ich SaveOptions.DisableFormatting explizit an die ToString-Methode übergebe. –

+0

Ich habe die Antworten hier versucht. Sie hatten keine Wirkung (verwendet immer noch Leerzeichen). Verwenden von .Net 4 (nicht Client). –

+0

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

Antwort

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

Das funktioniert einwandfrei. 'XDocument.ToString()' formatiert standardmäßig mit Einzug. Um eine unformatierte Ausgabe zu erhalten, müssen Sie sich aus dem Weg gehen, indem Sie '.ToString (SaveOptions.DisableFormatting)' –

+1

aufrufen Ich war eigentlich auf der Suche nach deaktivieren. Danke @JoelMueller – Eric

9

Von 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

Die Frage ist, wie Sie eine Zeichenfolge erstellen, nicht wie eine Datei erstellen. –

+1

@JC: Verwenden Sie einen StringWriter anstelle des Dateinamens im XmlTextWriter-Konstruktor, um eine Zeichenfolge abzurufen. –

+1

-1: Verwenden Sie nicht 'neue XmlTextWriter()' oder 'neue XmlTextReader()' nach .NET 1.1. Verwenden Sie 'XmlWriter.Create()' oder 'XmlReader.Create()'. –

2

Um einen String mit einem XDocument zu erstellen (anstelle eines XmlDocument) können Sie verwenden:

 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: Aktualisiert XmlWriter.Create zu verwenden und eine StringBuilder und gute Form (using).

+1

-1: Verwenden Sie keine neue XmlTextWriter() oder neue XmlTextReader() nach .NET 1.1. Verwenden Sie XmlWriter.Create() oder XmlReader.Create() –

+1

Danke, das habe ich verpasst. Ich habe das Sample entsprechend aktualisiert (und gleichzeitig die Komplexität mit einem StringBuilder verringert!) – DocMax

+0

Zu Ihrer Information, ich möchte immer noch meinen Downvote behalten, weil Sie keinen 'using' Block benutzt haben. –

7

Nur noch ein Geschmack der gleichen Suppe ... ;-)

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

Edit: dank John Saunders. Hier ist eine Version, die besser zu Creating XML Writers on MSDN passen sollte.

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

Bevorzugen Sie mir, aber wo ist Ihre Nutzung ?! – tomfanning

+1

-1: Verwenden Sie keine neuen XmlTextWriter() oder neuen XmlTextReader() nach .NET 1.1. Verwenden Sie XmlWriter.Create() oder XmlReader.Create() –

Verwandte Themen