Liest eine XML-Baumstruktur rekursiv in einer ListT mit Kindlisten

8

Ich habe ein XML wie folgt:

Und ich habe eine Mitgliedsklasse mit dem Namen der Eigenschaft.

Wie kann ich jede Unit und ihre untergeordneten Einheiten in mehrere generische List<Unit> lesen, die wiederum unter Verwendung der neuesten .NET-Technologie untergeordnete List<Unit> rekursiv verwenden können?

%Vor%     
msfanboy 28.05.2011, 20:43
quelle

4 Antworten

14

Dies würde es tun, mit einfachen Rekursion:

%Vor%     
BrokenGlass 28.05.2011, 21:21
quelle
1

Die Herausforderung wäre, es als 1 LINQ-Abfrage zu schreiben, aber das ist mir nicht möglich. LINQ ist nicht einfach / für Rekursion geeignet.

Ich werde eine Lösung skizzieren, ich werde es nicht aufschreiben:

  • lies das Xml in ein XDocument (oder XmlDocument)
  • definiere ein class Unit { ... ; ... List<Unit> Children; }
  • definieren, falls gewünscht, Einheiten und Root-Klassen. Ich werde diesen Teil hier abflachen
  • erhält eine flache Liste aller Unit-Tags, var units = doc.Descendants("Unit");
  • Wenn ich über diese Elemente Iteriere, gehe ich davon aus, dass ein Elternknoten immer vor einer verschachtelten Einheit
  • steht
  • suchen Sie das Parent jedes Knotens in einem var Lookup = new Dictionary<XNode, Unit> ();
  • Wenn ein Parent gefunden wurde, fügen Sie den aktuellen Knoten (neue Unit) zu seinen Children
  • hinzu
  • sonst fügen Sie es zu einer topList
  • hinzu
  • fügen Sie dem Wörterbuch die neue Unit und das XElement hinzu.
  • Das Nachschlagewörterbuch wird nur beim Erstellen der Listen benötigt.
Henk Holterman 28.05.2011 21:10
quelle
1
%Vor%

Sie können es wie folgt verwenden:

%Vor%     
svick 28.05.2011 21:15
quelle
1

Warum implementieren Sie keinen Tree zum Speichern von Einheiten? Das wäre viel einfacher und natürlicher als Listen.

Sehen Sie sich diesen Kommentar für eine gute Implementierung mit LinkedList an.

Siehe

Wenn Sie HAVE verwenden, können Sie die Rekursion verwenden, um sie zu erstellen. Ich gehe davon aus, dass Ihre Unit über eine Eigenschaft (IList Unit.ChildUnits) verfügt, die alle untergeordneten Listen enthält. Wenn nicht, möchten Sie vielleicht Unit in eine andere Klasse einpacken, die dies hat.

%Vor%     
YetAnotherUser 28.05.2011 20:54
quelle

Tags und Links