Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   C# [C#] Wie XML-Graph einlesen? (https://www.delphipraxis.net/138386-%5Bc-%5D-wie-xml-graph-einlesen.html)

jfheins 9. Aug 2009 12:17


[C#] Wie XML-Graph einlesen?
 
Hallo,
Ich stehe gerade vor dem Problem, einen Graphen aus einer XML-Struktur auszulesen.

Das Teil ist ein gerichteter, zyklenfreier Graph mit genau einer Quelle und einer Senke. Es gibt Kantengewichtungen (und einen ganzen Rattenschwanz an Infos zu jeder Kante)

Im XML sind Knoten und Kanten gespeichert:
XML-Code:
        <node>
            <id>1</id>
            <description>blablabla</description>
        </node>
.....
        <edge>
            <source_id>0</source_id>
            <target_id>1</target_id>
        </edge>
Meine erste Idee wäre, Klassen zu basteln, die sich genau so serialisieren/deserialisieren. Dann könnte man einfach nen XML-Deserializer verwenden und man bekommt den Graphen zurück.
Pferdefuß bei der Sache ist, dass ich eigentlich nicht die Knoten und Kanten jeweils in einer Liste haben will, sondern vielmehr den Graphen insgesamt.

Wobei ich mir auch nicht nicht ganz sicher bin, wie ich den Graphen am besten repräsentiere. Ich dachte da an eine Liste (in einem Objekt) dass die Knoten enthält, und die Knoten haben dann eine Liste mit Kanten oder so ...

Hat irgendwer ne Idee, wie man das am besten löst?

Khabarakh 9. Aug 2009 14:18

Re: [C#] Wie XML-Graph einlesen?
 
Ich denke, da bist du mit LINQ 2 XML schneller am Ziel und brauchst vor allem kein "Zwischen-Model" des Graphen. So etwa:
Code:
class Node
{
   public IList<Edge> Edges { get; private set; }
   public string Description { get; set; }

   public Node()
   {
      Edges = new List<Edge>();
   }
}

class Edge
{
   //public Node Source { get; set; } //?
   public Node Target { get; set; }
   ...
}

var root = XElement.Load(...);
var nodes = new Dictionary<int, Node>();

foreach (XElement nodeEl in root.Elements("node"))
   nodes.Add((int)nodeEl.Element("id"), new Node {
      Description = nodeEl.Element("description").Value
   });

foreach (XElement edgeEl in root.Elements("edge"))
   nodes[(int)edgeEl.Element("source_id")].Edges.Add(new Edge {
      Target = nodes[(int)edgeEl.Element("source_id")],
      ...
   };

jfheins 9. Aug 2009 16:17

Re: [C#] Wie XML-Graph einlesen?
 
Danke, damit komme ich erstmal zurecht ;)

Hab' jetzt erstmal die Klassen erstellt:

Eine Oberklasse, die bekommt den Dateinamen und liest eineige Daten aus, die noch vor dem Graphen kommen und
eine Klasse "Graph" mit 3 Listen für die Ecken, die Kanten und die Zusatzinfos (auch jeweils eigene Klassen)
bis auf die erste haben alle einen Kontruktor der ein XElement entgegen nimmt und sich daraus aufbaut.

Habs noch nicht ausprobiert, aber bis jetzt sieht das logisch, einfach und robust aus :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz