2012-10-05 61 views
3

我正在使用XDocument讀取XML文件並將其加載到類中。每個「站點」節點都應該是一個「標籤」節點是其中的List的類。我無法將「標籤」元素作爲列表加載到類中。將XML讀取到包含列表的類中<Class>

下面是類:

public class Site 
{ 
    public string name; 
    public string prefix; 
    public List<Tag> tags; 
} 
public class Tag 
{ 
    public string Name { get; set; } 
    public string Column { get; set; } 
} 

這是裝載XML數據到類的代碼:使用以下XML示例

settings = XDocument.Load("settings.xml"); 
IEnumerable<Site> sites = settings.Descendants("site").Select(x => new Site() 
{ 
    name = x.Element("name").Value, 
    prefix = x.Element("prefix").Value, 
    // How to load the "tag" elements into a List<Class>? 
}); 

<settings> 
    <site> 
     <name>name1</name> 
     <prefix>prefix1</prefix> 
     <tags> 
      <tag column="col1">tag1</tag> 
      <tag column="col2">tag2</tag> 
      <tag column="col3">tag3</tag> 
     </tags> 
    </site> 
    <site> 
     <name>name2</name> 
     <prefix>prefix2</prefix> 
     <tags> 
      <tag column="col1">tag1</tag> 
      <tag column="col2">tag2</tag> 
      <tag column="col3">tag3</tag> 
     </tags> 
    </site> 
</settings> 

由於。

+0

您是否考慮過使用[XmlSerializer](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx)? –

+0

我最初使用的是XmlDocument,但是在做更高級的XML讀取時,我讀到XDocument更容易使用,我發現這是真的。使用XmlDocument有什麼好處? – Fase

+0

是的,我會選擇XDocument over XmlDocument;我建議** XMLSerializer **,它爲您做序列化,而不是爬行XML。 –

回答

1

試試這個,在您的評論的位置//如何加載...:(未經測試)

tags = x.Element("tags").Elements("tag").Select(r => new Tag() { Column=r.Attribute("column"), Value = r.Value }); 
+0

該解決方案應該這樣做,但是您可能希望對從「x.Element(」tags「)」返回的元素執行空值檢查。你也可以跳過選擇,只是做一些像「foreach(var元素在x.Element(」標籤「)。元素(」標籤「)){tags.add新標籤(){列= element.Attribute(」列「),Value = element.Value);}」這取決於你最喜歡的東西。 –

+0

謝謝!只需做一些小的調整並將其變爲:tags = x.Element(「tags」)。Elements(「tag」)。Select(r => new Tag(){Column = r.Attribute(「column」 ).Value,Name = r.Value})。ToList() – Fase

4

這工作:

using System.IO; 
using System.Xml.Serialization; 

namespace Playground 
{ 
    public class Program 
    { 
     [XmlRoot("settings")] 
     public class Settings 
     { 
      [XmlElement("site")] 
      public Site[] Sites; 
     } 

     public class Site 
     { 
      [XmlElement("name")] 
      public string Name; 

      [XmlElement("prefix")] 
      public string Prefix; 

      [XmlArrayItem("tag", typeof(Tag))] 
      [XmlArray("tags")] 
      public Tag[] Tags; 
     } 

     public class Tag 
     { 
      [XmlAttribute("column")] 
      public string Column; 

      [XmlText] 
      public string Name; 
     } 

     public static void Main(string[] args) 
     { 
      using (FileStream reader = new FileStream("mydoc.xml", FileMode.Open)) 
      { 
       XmlSerializer ser = new XmlSerializer(typeof (Settings)); 
       Settings o = ser.Deserialize(reader) as Settings; 
      } 
     } 
    } 
} 

延伸閱讀:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.aspx (最重要的是XmlSerializer類)

http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.71).aspx

和維基百科關於XSD的文章(不能發佈超過兩個超鏈接)。