web-dev-qa-db-fra.com

Commande d'indentation et de nouvelle ligne pour XMLwriter en C #

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();
26
Dark Knight

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
}
40
Dennis

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();
  }
}
27
Ryan Masters

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

Définissez la propriété de mise en forme de XmlTextWriter:

TextWriter textWriter;
var xmlTextWriter = new XmlTextWriter(textWriter);
xmlTextWriter.Formatting = Formatting.Indented;
3
Guilherme Duarte

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.

1
Amit Shadadi

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.

0
SteveCinq