XML в IEnumerable <T> - PullRequest
       50

XML в IEnumerable <T>

6 голосов
/ 22 сентября 2009

Есть ли способ взять данный XML-файл и преобразовать (желательно с использованием C # Generics) его в конкретный бесчисленный список T, где 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 (не уверен, если это возможно)

Заранее спасибо

Ответы [ 3 ]

9 голосов
/ 22 сентября 2009

Даны следующие типы:

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);
3 голосов
/ 22 сентября 2009

Вот способ сделать это с сериализацией, если это ваша вещь:

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 голосов
/ 22 сентября 2009

Я не уверен, что полностью понимаю ваши обстоятельства, но один из подходов состоит в том, чтобы определить класс передачи данных и сделать его сериализуемым в XML. Затем вы можете десериализовать XML в массив объектов.

редактировать

Я не собираюсь удалять это, но я думаю, что то, что написал Эндрю Хэйр, ближе к тому, что вы хотите, и я проголосовал за него в поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...