2010-06-01 5 views
71

Ich habe einen List<string> "sampleList", dieXML-Dateierstellung mit XDocument in C#

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 bin derzeit XmlDocument verwenden, 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 die gleiche XML-Struktur mit XDocument erstellen?

+8

Bitte senden Sie den Code Sie bisher geschrieben haben. Die Leute schreiben im Allgemeinen nicht einfach Ihren Code für Sie. –

+5

Einverstanden - das ist eigentlich extrem einfach in einer einzigen Aussage zu tun, aber nur geben Sie die Antwort wird Ihnen nicht helfen, viel zu lernen. –

Antwort

161

LINQ to XML ermöglicht dies viel einfacher, durch drei Merkmale zu sein:

  • Sie ein Objekt erstellen können, ohne das Dokument zu wissen, es ist Teil
  • ist können Sie ein Objekt konstruieren und die Kinder als Argumente liefern
  • Wenn ein Argument iterable ist, wird es über

Sie können nur das tun, also hier wiederholt werden:

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 Code-Layout absichtlich verwendet, um den Code selbst die Struktur des Dokuments widerzuspiegeln.

Wenn Sie ein Element möchten, die einen Textknoten enthält, können Sie das Konstrukt nur durch im Text als einen anderen Konstruktor Argument übergeben:

// Constructs <element>text within element</element> 
XElement element = new XElement("element", "text within element"); 
+7

@ Jon Skeet: Danke .... :-) –

+14

Hinweis: Wenn Sie Elemente haben, die "inneren Text" haben müssen, fügen Sie sie wie folgt hinzu: 'new XElement (" description "," das ist der innere Text von das Beschreibungselement. ");' (ähnlich wie Sie Attribut/Wert-Paare hinzufügen) – Myster