Erstellung von XML-Dateien mit XDocument in C #

83

Ich habe eine List<string>"sampleList", die enthält

Data1
Data2
Data3...

Die Dateistruktur ist wie

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

Ich verwende derzeit XmlDocument, um dies zu tun.

Beispiel:

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");

Wie kann ich mit XDocument dieselbe XML-Struktur erstellen?

Thorin Oakenshield
quelle
8
Bitte posten Sie den Code, den Sie bisher geschrieben haben. Die Leute schreiben im Allgemeinen nicht einfach Ihren Code für Sie.
Mitch Wheat
5
Einverstanden - dies ist eigentlich extrem einfach in einer einzigen Aussage zu tun, aber nur die Antwort zu geben, hilft Ihnen nicht viel zu lernen.
Jon Skeet

Antworten:

190

Mit LINQ to XML ist dies durch drei Funktionen viel einfacher:

  • Sie können ein Objekt erstellen, ohne das Dokument zu kennen, zu dem es gehört
  • Sie können ein Objekt erstellen und die untergeordneten Elemente als Argumente angeben
  • Wenn ein Argument iterierbar ist, wird es wiederholt

Hier können Sie also einfach Folgendes tun:

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");
}

Ich habe dieses Codelayout absichtlich verwendet, damit der Code selbst die Struktur des Dokuments widerspiegelt.

Wenn Sie ein Element möchten, das einen Textknoten enthält, können Sie dies konstruieren, indem Sie den Text als weiteres Konstruktorargument übergeben:

// Constructs <element>text within element</element>
XElement element = new XElement("element", "text within element");
Jon Skeet
quelle
16
Hinweis: Wenn Sie Elemente haben, die "inneren Text" benötigen, fügen Sie sie folgendermaßen hinzu: new XElement("description","this is the inner text of the description element.");(ähnlich wie Sie Attribut / Wert-Paare hinzufügen)
Myster
Sehr schöner Ansatz. Ich hatte einen Moment Mühe, Attribute und einen Linq-Ausdruck von Elementen gleichzeitig hinzuzufügen. Wenn also jemand interessiert ist, wähle ich: new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))Mit den entsprechenden Zeilenumbrüchen sieht das wieder ganz ok aus.
Sebastian Werk
0

Die Verwendung der .Save-Methode bedeutet, dass die Ausgabe eine Stückliste hat, mit der nicht alle Anwendungen zufrieden sind. Wenn Sie keine Stückliste wünschen und sich nicht sicher sind, schlage ich vor, dass Sie dies nicht tun, und übergeben Sie das XDocument an einen Verfasser:

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