2009-09-22 56 views
6

有沒有辦法把一個給定的XML文件,並轉換(最好使用C#泛型)成T的混凝土的IEnumerable列表,其中T是我的具體類XML到IEnumerable的<T>

因此,例如,我可能有一個XML文件中像

<fruits> 
    <fruit> 
     <id>1</id> 
     <name>apple</name> 
    </fruit> 
    <fruit> 
     <id>2</id> 
     <name>orange</name> 
    </fruit> 
</fruits> 

,我希望看到一個水果的清單對象

它有一個像

public class Fruit : IFruit 
{ 
    public string name; 
    public int id; 
} 
性質

我認爲我需要某種映射,如果我是使用仿製藥,因爲我想這對於理想的IFruit接口工作(不知道如果多數民衆贊成可能)提前

感謝

回答

9

考慮以下幾種類型:

public interface IFruit 
{ 
    String name { get; set; } 
    Int32 id { get; set; } 
} 

public class Fruit : IFruit 
{ 
    public String name { get; set; } 
    public Int32 id { get; set; } 
} 

我認爲你可以做這樣的事情:

static IEnumerable<T> GetSomeFruit<T>(String xml) 
     where T : IFruit, new() 
    { 
     return XElement.Parse(xml) 
      .Elements("fruit") 
      .Select(f => new T { 
       name = f.Element("name").Value, 
       id = Int32.Parse(f.Element("id").Value) 
      }); 
    } 

,你會叫這樣的:

IEnumerable<Fruit> fruit = GetSomeFruit<Fruit>(yourXml); 
+0

我喜歡這個解決方案,它實際上也支持XML序列化。我唯一的評論是,.NET公約通常要求公有領域(或者更現實的說公共領域)以大寫字母開頭,但那是哈里森的決定,而不是你的。 – 2009-09-22 15:59:34

+0

尼斯。爲了更進一步,我想可能會有每種類型的水果的子類爲一個通用的方法,如這樣返回一個匹配類型的水果節點,即如果T =橙色,那麼只返回那些名字是橙色的水果。該方法可以將類型(T).Name與xml中的水果名稱進行比較,並排除其他人...僅僅是我的2美分 – 2009-09-23 02:37:03

+0

您是天才,您保存了我的大量作品 – Moons 2012-01-19 12:38:29

0

我不確定自己完全瞭解你的情況,但一種方法是定義一個數據傳輸類並使其可以在XML中進行序列化。然後你可以將XML解串成一個對象數組。

編輯

我不會刪除這一點,但我認爲,安德魯野兔發佈更接近你想要什麼,我已經上投他的支持。

+0

@Steven - 抱歉,我刪除了我的帖子,重新考慮了問題,然後在編輯後取消刪除了我的答案。對困惑感到抱歉! – 2009-09-22 15:44:09

+0

沒問題。我將刪除重複的代碼以避免混淆。 – 2009-09-22 15:57:13

3

這裏有一個方法如果這是你的事情:

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

public static class Test 
{ 
    public static void Main(string[] args) 
    { 
     var fs = new FileStream("fruits.xml", FileMode.Open); 
     var x = new XmlSerializer(typeof(Fruits)); 
     var fruits = (Fruits) x.Deserialize(fs); 
     Console.WriteLine("{0} count: {1}", fruits.GetType().Name, fruits.fruits.Length); 
     foreach(var fruit in fruits.fruits) 
      Console.WriteLine("id: {0}, name: {1}", fruit.id, fruit.name); 
    } 
} 

[XmlRoot("fruits")] 
public class Fruits 
{ 
    [XmlElement(ElementName="fruit")] 
    public Fruit[] fruits; 
} 

public class Fruit 
{ 
    public string name; 
    public int id; 
} 
+0

感謝您將示例代碼放入肉體擺脫我的袖手旁觀的建議。 – 2009-09-22 16:00:09

+0

感謝這讓我的頭腦更加清晰。由於我沒有用XML做很多序列化,所以我很難將泛型部分弄清楚 - 完美! – harrisonmeister 2009-09-23 09:16:20

相關問題