Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   C# Wann Element <> Attribut ? (https://www.delphipraxis.net/143714-wann-element-attribut.html)

jfheins 21. Nov 2009 21:29


Wann Element <> Attribut ?
 
Erstmal Sorry für den bescheidenen Titel :stupid:

Ich bin gerade dabei, einen Graphen in XMl zu speichern. Das sieht im Moment so ähnlich aus:
XML-Code:
<graph name="Hauptgraph">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <node id="3" />
    <node id="4" />
    <node id="5" />
    <node id="6" />
    <edge>
      <source_id>0</source_id>
      <target_id>1</target_id>
    </edge>
    <edge>
      <source_id>1</source_id>
      <target_id>3</target_id>
    </edge>
....
Wie man sieht haben die Knoten je eine id und jede Kante bekommt 2 Node-ID's
Und jetzt die Frage: Wann verwendet man Attribute und wann Elemente? Gibt es da eine Richtlinie, best practices oder sowas an der Art? Oder ist das komplett egal und einem selbst überlassen?

Grüße,
Julius

Phoenix 21. Nov 2009 21:36

Re: Wann Element <> Attribut ?
 
Wenn die beiden Angaben Pflicht sind, spricht nichts dagegen, sie als Attribute anzugeben. Ich würde Elemente eher dann verwenden, wenn die Anzahl unreguliert ist. Bei nur zwei Werten die sowieso immer Pflicht sind reichen Attribute vollkommen aus.

Edith sagt: Ausserdem wäre das in Deinem Fall nur Konsequent. Eine Kante wird genau durch die zwei Punkte definiert. Diese beiden Punkte in verbindung sind wie die ID des einzelnen Knotens ein eineindeutiger Schlüssel und deshalb als Attribut prädestiniert.

himitsu 21. Nov 2009 21:38

Re: Wann Element <> Attribut ?
 
Im Prinzip ist es egal und dir überlassen.

Es kommt auch darauf an, ob jemand mal in den XML-Code reinsieht, bzw reingucken MUß,
denn dann ist es besser, wenn eine übersichtlichere Variante genommen wird.

Man kann auch etwas die Dateigröße damit beeinflußen.

Zuviele Attribute können auch wieder unübersichtlich wirken.

Und man kann über die Wahl Attribut<>Element auch die Art/Stärke der Bindung angeben.
z.B. wenn man verschachtelte Elemente (einen Baum/Tree) hat, dann machen sich Eigenschaften als Attribute besser, da sie so mehr zum Element gehören und sich nicht mit den SubElementen vermischen.

ist doch schon handlicher?
XML-Code:
<graph name="Hauptgraph">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <node id="3" />
    <node id="4" />
    <node id="5" />
    <node id="6" />
    <edge source_id="0" target_id="1" />
    <edge source_id="1" target_id="3" />
Wenn man unbedingt eine Regel haben will:
> wenn der "Text" zu groß/lang sein kann, dann nicht als Attribut

arbu man 21. Nov 2009 21:47

Re: Wann Element <> Attribut ?
 
Verwende die Lösung als Attribute, dann bist du näher an GraphML, bzw. es wäre dann schon fast GraphML.
Ich würde dir raten den Graph mit GraphML Format zu speichern, das hätte den Vorteil es gibt schon Programm mit dennen man sich den Graphen angucken könnte etc.

GraphML
http://www.inf.uni-konstanz.de/algo/...g/GraphML.html

jfheins 21. Nov 2009 22:17

Re: Wann Element <> Attribut ?
 
Okay, danke schonmal - dann werde ich meinem Betreuer mal vorschlagen die source und target ID als Attribute zu definieren ...

Das mit GraphML hörte sich zwar im ersten Moment gut an - aber es gibt einen kleinen Pfredefuß: Hierarchische Graphen werden zwar unterstützt, aber nur über die Knoten und nicht über die Kanten ...

Ich zeig' euch einfach mal ein komplettes Dokument (wie es im Moment ist)
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<graph>
  <subgraph id="0" name="Graph Nr. 0">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <edge isgraph="false">
      <source_id>0</source_id>
      <target_id>1</target_id>
    </edge>
    <edge isgraph="true">
      <source_id>1</source_id>
      <target_id>2</target_id>
      <subgraph_id>1</subgraph_id>
    </edge>
  </subgraph>
  <subgraph id="1" name="Graph Nr. 1">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <node id="3" />
    <edge isgraph="false">
      <source_id>0</source_id>
      <target_id>1</target_id>
    </edge>
    <edge isgraph="false">
      <source_id>1</source_id>
      <target_id>3</target_id>
    </edge>
    <edge isgraph="false">
      <source_id>0</source_id>
      <target_id>2</target_id>
    </edge>
    <edge isgraph="false">
      <source_id>2</source_id>
      <target_id>3</target_id>
    </edge>
  </subgraph>
</graph>
Dazu kommt noch, dass
1. Jede Kante, die keinen Subgraph hat muss eine Task-Element haben. (Auch umgekehrt)
2. Jeder Knoten hat noch eine Liste von Teilen

@himi: Du siehst, "kompakt" wird das nicht :mrgreen:

P.S.: Wenn ihr euch darunter nocht nichts vorstellen könnt, kann ich euch auch ein Bild machen, aber die Frage ist erstmal beantwortet :stupid:

himitsu 21. Nov 2009 22:31

Re: Wann Element <> Attribut ?
 
für geile Bilder haben wir doch immer was übrig :angel2:

ansonsten gibt es tausende Lösungen
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<graph>
  <subgraph id="0" name="Graph Nr. 0">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <edge isgraph="false" source_id="0" target_id="1" />
    <edge isgraph="true" source_id="1" target_id="2">
      <subgraph_id>1</subgraph_id>
    </edge>
  </subgraph>
  <subgraph id="1" name="Graph Nr. 1">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <node id="3" />
    <edge isgraph="false" source_id="0" target_id="1" />
    <edge isgraph="false" source_id="1" target_id="3" />
    <edge isgraph="false" source_id="0" target_id="2" />
    <edge isgraph="false" source_id="2" target_id="3" />
  </subgraph>
</graph>
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<graph>
  <subgraph id="0" name="Graph Nr. 0">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <edge isgraph="false" source_id="0" target_id="1" />
    <edge isgraph="true" source_id="1" target_id="2" subgraph_id="1" />
  </subgraph>
  <subgraph id="1" name="Graph Nr. 1">
...
wenn ein subgraph immer nur einem edge zugeordnet ist oder Keinem, dann ginge es auch so
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<graph>
  <subgraph id="0" name="Graph Nr. 0">
    <node id="0" />
    <node id="1" />
    <node id="2" />
    <edge isgraph="false" source_id="0" target_id="1" />
    <edge isgraph="true" source_id="1" target_id="2">
      <subgraph id="1" name="Graph Nr. 1">
        <node id="0" />
        <node id="1" />
        <node id="2" />
        <node id="3" />
        <edge isgraph="false" source_id="0" target_id="1" />
        <edge isgraph="false" source_id="1" target_id="3" />
        <edge isgraph="false" source_id="0" target_id="2" />
        <edge isgraph="false" source_id="2" target_id="3" />
      </subgraph>
    </edge>
  </subgraph>
</graph>
Wobei man isgraph= doch garnicht benötigt?
Dieses erkennt man ja auch an subgraph_id, bzw. dem untergeordnetem subgraph.

jfheins 21. Nov 2009 23:03

Re: Wann Element <> Attribut ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nagut, extra für dich ein Bild von dem oben geposteten Graphen ;)
(Die gestrichelte Kante bedeutet, dass diese Kante einen Subgraph repräsentiert)

Zitat:

wenn ein subgraph immer nur einem edge zugeordnet ist oder Keinem, dann ginge es auch so
Ist nicht der Fall ;)

Mit dem "weniger Platzverbrauch"-Argument könnte ich sogar was bewirken - bei ein paar zigtausend Knoten (im Extremfall) .... wobei dann eh der kürzeste-Pfad-Algorithmus (der auf den ganzen Graphen losgelassen wird) der Flaschenhals sein dürfte - zum Glück nicht meine Baustelle :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 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