2009-09-22 20 views
6

Gibt es eine Möglichkeit, eine bestimmte XML-Datei zu nehmen und wandelt es in eine Beton IEnumerable Liste der T (vorzugsweise C# Generics verwenden), wo T meine konkrete Klasse istXML IEnumerable <T>

So zum Beispiel kann ich eine XML-Datei wie

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

und ich möchte eine Liste von einer Frucht sehen, Objekte

wo es Eigenschaften wie

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

Ich nehme an, ich würde eine Art von Mapping benötigen, wenn ich Generika zu verwenden, da ich dies für ideal die IFruit Schnittstelle (nicht sicher, ob das ist möglich)

Vielen Dank im Voraus arbeiten möchte

Antwort

9

folgende Typen Gegeben:

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

Ich denke, dass man so etwas tun könnte:

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

Welche du so nennen würde:

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

Ich mag diese Lösung, und sie ist tatsächlich kompatibel mit der Aktivierung der XML-Serialisierung. Der einzige Kommentar, den ich machen würde, ist, dass .NET-Konventionen typischerweise erfordern, dass öffentliche Felder (oder realistischere öffentliche Eigenschaften) mit einem Großbuchstaben beginnen, aber das war Harrisons Entscheidung, nicht Ihre. –

+0

Nice.Um dies einen Schritt weiter zu gehen, würde ich mir vorstellen, dass es Unterklassen für jede Art von Früchten für eine generische Methode geben würde, um Fruchtknoten eines passenden Typs zurückzugeben, dh wenn T = Orange, dann geben nur die Früchte zurück, deren Name Orange ist . Die Methode könnte den Typ von (T) .Name mit dem Namen der Frucht von der xml vergleichen und andere ausschließen ... gerade meine 2 Cent –

+0

Sie sind Genie, Sie speicherten mein Los der Arbeit – Moons

0

Ich bin mir nicht sicher, ob ich Ihre Umstände vollständig verstehe, aber ein Ansatz besteht darin, eine Datenübertragungsklasse zu definieren und sie in XML serialisierbar zu machen. Dann können Sie das XML in ein Array von Objekten deserialisieren.

bearbeiten

Ich bin nicht gehen zu löschen, aber ich denke, dass Andrew Hare, was geschrieben ist näher an, was Sie wollen, und ich habe bis gestimmt ihn unterstützen.

+0

@Steven - Sorry, ich habe meinen Beitrag gelöscht, das Problem neu überdacht und dann meine Antwort nach einer Bearbeitung wiederhergestellt. Entschuldigung für die Verwirrung! –

+0

Kein Problem. Ich werde den doppelten Code entfernen, um Verwechslungen zu vermeiden. –

3

Hier ist ein Weg, um es mit der Serialisierung zu tun, wenn das dein Ding ist:

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

Dank für das Zusammenstellen des Beispielcodes zu Fleisch aus meinem Vorschlag. –

+0

Dank dieses hat es viel klarer in meinem Kopf gemacht. Ich hatte Schwierigkeiten, den Generika-Teil herauszufinden, da ich nicht viel Serialisierung mit XML gemacht habe - perfekt! – harrisonmeister

Verwandte Themen