web-dev-qa-db-fra.com

Création de fichier XML à l'aide de XDocument en C #

J'ai un List<string> "sampleList" qui contient

Data1
Data2
Data3...

La structure du fichier est comme

<file>
   <name filename="sample"/>
   <date modified ="  "/>
   <info>
     <data value="Data1"/> 
     <data value="Data2"/>
     <data value="Data3"/>
   </info>
</file>

J'utilise actuellement XmlDocument pour cela.

Exemple:

List<string> lst;
XmlDocument XD = new XmlDocument();
XmlElement root = XD.CreateElement("file");
XmlElement nm = XD.CreateElement("name");
nm.SetAttribute("filename", "Sample");
root.AppendChild(nm);
XmlElement date = XD.CreateElement("date");
date.SetAttribute("modified", DateTime.Now.ToString());
root.AppendChild(date);
XmlElement info = XD.CreateElement("info");
for (int i = 0; i < lst.Count; i++) 
{
    XmlElement da = XD.CreateElement("data");
    da.SetAttribute("value",lst[i]);
    info.AppendChild(da);
}
root.AppendChild(info);
XD.AppendChild(root);
XD.Save("Sample.xml");

Comment créer la même structure XML avec XDocument?

77

LINQ to XML permet d’être beaucoup plus simple, grâce à trois fonctionnalités:

  • Vous pouvez construire un objet sans connaître le document dont il fait partie
  • Vous pouvez construire un objet et fournir les enfants comme arguments
  • Si un argument est itérable, il sera itéré sur

Donc, ici, vous pouvez simplement faire:

void Main()
{
    List<string> list = new List<string>
    {
        "Data1", "Data2", "Data3"
    };

    XDocument doc =
      new XDocument(
        new XElement("file",
          new XElement("name", new XAttribute("filename", "sample")),
          new XElement("date", new XAttribute("modified", DateTime.Now)),
          new XElement("info",
            list.Select(x => new XElement("data", new XAttribute("value", x)))
          )
        )
      );

    doc.Save("Sample.xml");
}

J'ai utilisé cette disposition de code délibérément pour que le code lui-même reflète la structure du document.

Si vous voulez un élément contenant un nœud de texte, vous pouvez le construire simplement en transmettant le texte en tant qu'autre argument de constructeur:

// Constructs <element>text within element</element>
XElement element = new XElement("element", "text within element");
180
Jon Skeet

L'utilisation de la méthode .Save signifie que la sortie aura une nomenclature, ce qui ne plaira pas à toutes les applications. Si vous ne voulez pas de nomenclature, et si vous n'êtes pas sûr, je vous suggère de ne pas le faire, puis transmettez le document XDocument à un rédacteur:

using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}
0
guestuser