XML to IEnumerable

后端 未结 3 532
旧时难觅i
旧时难觅i 2021-02-09 15:42

Is there a way to Take a given XML file and convert (preferably using C# Generics) it into a Concrete Ienumerable list of T where T is my concrete class

So for example

相关标签:
3条回答
  • 2021-02-09 15:51

    Here's a way to do it with serialization, if that's your thing:

    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 讨论(0)
  • 2021-02-09 15:59

    Given the following types:

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

    I think that you could do something like this:

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

    Which you would call like this:

    IEnumerable<Fruit> fruit = GetSomeFruit<Fruit>(yourXml);
    
    0 讨论(0)
  • 2021-02-09 16:07

    I'm not sure I fully understand your circumstances, but one approach is to define a data transfer class and make it serializable in XML. Then you can deserialze the XML into an array of objects.

    edit

    I'm not going to delete this, but I think that what Andrew Hare posted is closer to what you want, and I've up-voted him in support.

    0 讨论(0)
提交回复
热议问题