J'écris des données dans un fichier XML ... mais quand je l'ouvre, toutes les valeurs sont sur une seule ligne ... comment peut-on l'écrire dans un format lisible, c'est-à-dire chaque nœud dans la nouvelle ligne et l'indentation?
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();
Utilisez un XmlTextWriter
au lieu de XmlWriter
, puis 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 les commentaires de @jumbo, cela pourrait également être implémenté comme dans .NET 2.
var filename = "MyFile.xml";
var settings = new XmlWriterSettings()
{
Indent = true,
IndentChars = " "
}
using (var w = XmlWriter.Create(filename, settings))
{
// ... Write elements
}
Vous devez d'abord créer un objet XmlWriterSettings qui spécifie votre mise en retrait, puis lors de la création de votre XmlWriter, transmettez-lui XmlWriterSettings après votre chemin.
De plus, j'utilise le bloc using
pour permettre à C # de gérer la disposition de mes ressources, de sorte que je n'ai pas à craindre de perdre des ressources lors d'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();
}
}
Vérifiez la propriété Settings:
w.Settings.Indent = true;
Edit: Vous ne pouvez pas le définir directement:
System.Xml.XmlWriter.Create("path", new System.Xml.XmlWriterSettings())
Définissez la propriété de mise en forme de XmlTextWriter:
TextWriter textWriter;
var xmlTextWriter = new XmlTextWriter(textWriter);
xmlTextWriter.Formatting = Formatting.Indented;
Utilisez 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 mènera où vous voulez, cependant, vous n’aurez pas à utiliser MemoryStream, la partie la plus importante est les paramètres.
Une petite version de VB.NET utilisant XmlWriter plus XmlWriterSettings directement dans un 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
Recherchez dans le document d'autres paramètres et options de remplacement de fichier, mais cette opération est propre et fonctionne comme prévu dans de nombreuses situations.