2010-11-04 30 views
26

J'écris des données dans un fichier XML ... mais quand je l'ouvre toutes les valeurs sont dans une seule ligne ... comment l'écrire dans un format lisible? dans la nouvelle ligne et l'indentation?Indentation et nouvelle commande de ligne pour 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(); 

Répondre

37

Utiliser un XmlTextWriter i Au lieu de XmlWriter, définissez les propriétés Indentation.

Exemple

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 
} 

Après commentaire @jumbo, cela pourrait aussi être mis en œuvre comme dans .NET 2.

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

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

sauf que vous ne pouvez pas définir la propriété XmlSettings si nécessaire –

+1

L'utilisation de XmlTextWriter est [n'est plus recommandée] (https://msdn.microsoft.com/fr-fr/library/system.xml.xmltextwriter (v = vs. 110) .aspx) (depuis .Net2.0). Voir [ce QA] (https://stackoverflow.com/questions/26075559/what-is-the-purpose-of-xmltextwriter-if-xmlwriter-is-the-recommended-one) pour plus d'informations. – jumbo

+0

@jumbo merci pour le conseil, c'est bon à savoir. – Dennis

7

Vérifiez la propriété Settings:

w.Settings.Indent = true; 

Edit: Vous ne pouvez pas définir directement:

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

exception: La propriété 'XmlWriterSettings.Indent' est en lecture seule et ne peut pas être définie –

+0

Ma faute, vous devez utiliser la méthode "Create" et la transmettre directement; réponse mise à jour. – jvenema

+1

Ne fonctionne pas pour moi ..... – Afra

3

définir la propriété Mise en forme de XmlTextWriter:

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

Quelle version de .NET (ou assembly?) Est cette propriété "' Formatage "dans? Ma solution cible la version 4.5.1, et ne connaît aucune propriété "' Formatting' "sur' Xml (Text?) Writer'? – Zack

25

Vous devez d'abord créer un objet XmlWriterSettings qui spécifie votre retrait, puis, lors de la création de votre XmlWriter, transmettez les XmlWriterSettings après votre chemin.

En outre, j'utilise le bloc using pour permettre à C# de gérer l'élimination de mes ressources afin de ne pas avoir à perdre de ressources sur une exception.

{ 
    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

Techniquement, mettre "' Indent' "à true est tout ce dont vous avez besoin ici pour que le' Xml (Text?) Writer' émette de nouvelles lignes. – Zack

1

Utiliser les paramètres comme suit:

 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.. 
     } 

Cela vous où vous voulez, cependant, vous ne devez pas utiliser MemoryStream, la partie est les paramètres importent.

0

Une version peu VB.NET en utilisant XmlWriter, plus XmlWriterSettings direct à fichier:

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 

Vérifiez la Doco pour d'autres paramètres fichier d'options et d'écrasement, mais cela est propre et fonctionne comme prévu dans beaucoup de situations.