C# XML到IEnumerable

C# XML到IEnumerable,c#,asp.net,xml,linq,C#,Asp.net,Xml,Linq,有没有一种方法可以获取给定的XML文件并最好使用C泛型将其转换为T的具体Ienumerable列表,其中T是我的具体类 例如,我可能有一个XML文件,如 <fruits> <fruit> <id>1</id> <name>apple</name> </fruit> <fruit> <id>2</id>

有没有一种方法可以获取给定的XML文件并最好使用C泛型将其转换为T的具体Ienumerable列表,其中T是我的具体类

例如,我可能有一个XML文件,如

<fruits>
    <fruit>
        <id>1</id>
        <name>apple</name>
    </fruit>
    <fruit>
        <id>2</id>
        <name>orange</name>
    </fruit>
</fruits>
我假设如果我要使用泛型,我需要某种映射,因为我希望它在理想情况下适用于IFruit接口,但不确定这是否可行


提前感谢

我不确定我是否完全理解您的情况,但一种方法是定义一个数据传输类并使其可在XML中序列化。然后可以将XML反序列化为对象数组

编辑


我不打算删除此内容,但我认为安德鲁·黑尔发布的内容更接近你想要的内容,我已投票支持他。

鉴于以下类型:

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);
你会这样称呼它:

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

如果您喜欢序列化,这里有一种方法:

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

@史蒂文-对不起,我删除了我的帖子,重新思考了这个问题,然后在编辑后取消了我的答案。抱歉搞混了!没问题。我将删除重复的代码以避免混淆。我喜欢这个解决方案,而且它实际上与启用XML序列化兼容。我唯一要说的是.NET协议通常要求公共字段或更现实的公共属性以大写字母开头,但这是Harrison的决定,不是你的。很好。为了更进一步,我想,对于像这样的泛型方法,每种类型的水果都会有子类来返回匹配类型的水果节点,也就是说,如果T=Orange,那么只返回那些名称为Orange的水果。该方法可以将typeofT.Name与xml中的水果名称进行比较,并排除其他名称。。。这是我的2分感谢,感谢你把示例代码放在一起,充实了我的即兴建议。谢谢,这让我的头脑更清晰了。我很难理解泛型部分,因为我没有用XML-perfect完成太多序列化!