Indentation et nouvelle commande de ligne pour XMLwriter en C#
j'écris des données dans un fichier XML...mais quand je l'ouvre toutes les valeurs sont en une seule ligne...comment l'écrire dans un format lisible?dire que 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();
6 réponses
un XmlTextWriter
au lieu de XmlWriter
et puis définissez Indentation
propriétés.
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
}
suite au commentaire @jumbo, cela pourrait aussi ê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 indentation, puis lors de la création de votre XmlWriter, passer dans les XmlWriterSettings après votre chemin.
en plus, j'utilise le using
bloc à laisser de C# poignée de la cession de mes ressources, de sorte que je n'ai pas besoin de vous soucier de perdre des 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();
}
}
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())
définir la propriété de formatage du XmlTextWriter:
TextWriter textWriter;
var xmlTextWriter = new XmlTextWriter(textWriter);
xmlTextWriter.Formatting = Formatting.Indented;
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 mènera où vous voulez, cependant, vous n'avez pas à utiliser MemoryStream, la partie importante est les paramètres.
un peu VB.NET version utilisant XmlWriter plus XmlWriterSettings direct to file:
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 le doco pour d'autres paramètres et les options de réécriture de fichiers, mais c'est propre et fonctionne comme prévu dans de nombreuses situations.