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();
26
demandé sur Kevin Panko 2010-11-04 08:45:27

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
}
38
répondu Dennis 2017-03-20 13:22:13

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();
  }
}
27
répondu Ryan Masters 2012-07-19 12:38:48

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())
7
répondu jvenema 2010-11-04 06:44:39

définir la propriété de formatage du XmlTextWriter:

TextWriter textWriter;
var xmlTextWriter = new XmlTextWriter(textWriter);
xmlTextWriter.Formatting = Formatting.Indented;
3
répondu Guilherme Duarte 2010-11-04 05:51:48

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.

1
répondu Amit Shadadi 2014-04-30 06:57:28

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.

0
répondu SteveCinq 2017-04-04 19:23:44