C# XML到IEnumerable
有没有一种方法可以获取给定的XML文件并最好使用C泛型将其转换为T的具体Ienumerable列表,其中T是我的具体类 例如,我可能有一个XML文件,如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>
<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完成太多序列化!