2010-06-01 99 views
71

我有一個List<string> 「sampleList」,其中包含XML文件創建在C#

Data1 
Data2 
Data3... 

文件結構是一樣

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

我目前使用XmlDocument的做到這一點。

例子:

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

如何創建使用的XDocument相同的XML結構?

+8

請郵寄到現在爲止您編寫的代碼。人們通常不喜歡只爲你寫代碼。 – 2010-06-01 08:33:29

+5

同意 - 這實際上在一個陳述中非常簡單,但只是給你答案不會幫助你學到很多東西。 – 2010-06-01 08:37:46

回答

161

的LINQ to XML允許這要簡單得多,通過三個特點:

  • 可以構造一個對象不知道它是
  • 部分可以構造一個對象的文檔,並提供兒童作爲參數
  • 如果參數是迭代的,它會在

迭代,所以在這裏,你可以這樣做:

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

我已經故意使用此代碼佈局,使代碼本身反映文檔的結構。

如果你想包含一個文本節點的元素,您可以構造只需在文本傳遞另一個構造函數的參數:

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

@ Jon Skeet:謝謝.... :-) – 2010-06-01 08:53:46

+14

注意:如果你的元素需要有「內部文本」,你可以像這樣添加它們:'new XElement(「description」,「this is the inner text描述元素「);'(類似於你添加屬性/值對的方式) – Myster 2010-11-23 00:30:44