[XML] Elemente vs. Attribute



  • Hallo erstmal

    Die Frage ist sicher blöd, aber mir ist der Sinn von Attributen nicht ganz klar.

    <Waffen>
    	<Nahkampf>
    		<Schwert>
    			<Schaden>2</Schaden>
    			<Gewicht>3</Gewicht>
    			<Hand>1</Hand>
    		</Schwert>
    		<Axt>
    			<Schaden>4</Schaden>
    			<Gewicht>5</Gewicht>
    			<Hand>2</Hand>
    		</Axt>
    	<Nahkampf>
    	<Fernkampf>
    		<Bogen>
    			<Schaden>2</Schaden>
    			<Gewicht>2</Gewicht>
    			<Hand>2</Hand>
    		</Bogen>
    	</Fernkampf>
    </Waffen>
    

    oder

    <Waffe Name="Schwert" Art="Nahkampf" Schaden=2 Gewicht=3 Hand=1>
    	???
    </Waffe>
    <Waffe Name="Axt" Art="Nahkampf" Schaden=4 Gewicht=5 Hand=2>
    	???
    </Waffe>
    <Waffe Name="Bogen" Art="Fernkampf" Schaden=2 Gewicht=2 Hand=2>
    	???
    </Waffe>
    

    Wobei ich auch nicht weiss, was bei den ??? noch hinkommen sollte. 😕

    Tendiere zu ersterem, da die files nicht von Hand gelesen oder geschrieben werden, sondern per Editor.

    Danke schonmal 🙂



  • Mit Attributen kann man etwas über die eigentlichen Daten aussagen. Das heißt, dass man dort wunderbar Meta-Informationen unterbringen kann. Eine typische Meta-Information wäre z.B. eine ID für einen Datensatz. Eine ID selbst ist zwar nützlich, gehört aber eben nicht zu den "eigentlichen" Daten, die man speichern will. Oft sind auch Sprachangaben eine typische Meta-Information. Auch wenn manchmal ziemlich über Attribute geschimpft wird (wer war's? rüdiger, ich schaue dich an :D), so bieten sie einem eben eine Möglichkeit Daten und Metadaten zu trennen. Das ist der eigentliche Sinn von Attributen.



  • In deinem Fall haben sie auch wenig Sinn. Um Attribute zu verstehen musst du die Geschichte von XML verstehen. XML ist eben eine Markupsprache und wurde daher nicht für die Datenhaltung entworfen, die du betreibst. Dazu wurde XML erst später missbraucht.

    Eine Markupsprache zeichnet eben Stellen in einem Text aus (zB bei HTML oder Docbook). Wenn man nun Metainformationen einfügen will (zB beim Link-Tag, den Link), kann man eben den Text nicht ändern. Dafür gibt es dann Attribute.

    Bsp

    <a><href>http://www.c-plusplus.net</href>Beste C++-Seite überhaupt</a>
    <-- das geht natürlich nicht, da der Link nun Bestandteil des Textes ist.
    
    <a href="http://www.c-plusplus.net">Beste C++-Seite überhaupt</a> <-- daher nimmt man Attribute für Metadaten
    

    Wenn du XML als Datenformat missbrauchst, dann solltest du eher auf Attribute verzichten, da dies die Verarbeitung der Datenstrukturen in deiner Anwendung vereinfacht.



  • Also sollt ich gar nicht XML verwenden für die Daten?



  • Ralf P. Gut schrieb:

    Also sollt ich gar nicht XML verwenden für die Daten?

    Das kommt drauf an. XML ist weit verbreitet, daher kann es manchmal sinnvoll sein auch Daten in XML abzuspeichern. Wenn du zB die Daten an einen Browser weiterleiten willst oä. Wenn es sich nur um ein internes Format handelt, würde ich kein XML verwenden (auch wenn minhen mir vermutlich widersprechen wird)



  • Ralf P. Gut schrieb:

    Hallo erstmal

    Die Frage ist sicher blöd, aber mir ist der Sinn von Attributen nicht ganz klar. Wobei ich auch nicht weiss, was bei den ??? noch hinkommen sollte. 😕

    Tendiere zu ersterem, da die files nicht von Hand gelesen oder geschrieben werden, sondern per Editor.

    Danke schonmal 🙂

    Einen technischen Grund, das Eine oder Andere zu wählen, gibt es nicht.
    Eine Konvention sagt: Tags verkörpern Objekte, Attritute eben Attribute (Eigenschaften).

    Wenn es keinen Sinn macht etwas im Knoten zu schreiben, setzt man statt Open und Close Tag ein / > am Ende.
    Also statt
    <Waffe Name="Schwert" Art="Nahkampf" Schaden=2 Gewicht=3 Hand=1>
    ???
    </Waffe>

    wähle
    <Waffe Name="Schwert" Art="Nahkampf" Schaden=2 Gewicht=3 Hand=1 />



  • Ralf P. Gut schrieb:

    Also sollt ich gar nicht XML verwenden für die Daten?

    Dock klar, dafür ist XML entwickelt worden. Du befindest dich dabei in sehr guter Gesellschaft und wirst jede Menge Unterstützung und Hilfe finden. Das hat auch seinen Grund.

    rüdiger schrieb:

    Um Attribute zu verstehen musst du die Geschichte von XML verstehen. XML ist eben eine Markupsprache und wurde daher nicht für die Datenhaltung entworfen, die du betreibst. Dazu wurde XML erst später missbraucht.

    Mal davon abgesehen dass deine Ausführung zur Geschichte von XML schlicht falsch ist. XML wurde von Anfang an für Datenhaltung entworfen. Bereits in den ältesten Dokumenten zu XML nachzulesen. Aber um deine falschen Behauptungen geht es mir gar nicht. Viel eher würde mich interessieren, wie du denn bitte Metadaten abspeichern würdest.



  • Ja, ne, is nur interne Verwendung.
    Aber finds einfacher zu parsern als einfache Textfiles.



  • Bitte, das wollte ich nicht, nicht streiten. 😮 🤡

    Wenn mir jemand einen Tipp geben kann, wie ich die Daten oben am besten darstellen kann, wär ich froh.



  • Ralf P. Gut schrieb:

    Bitte, das wollte ich nicht, nicht streiten. 😮 🤡

    Wenn mir jemand einen Tipp geben kann, wie ich die Daten oben am besten darstellen kann, wär ich froh.

    Es streitet doch keiner. Und deine Frage ist ebenfalls längst beantwortet. Wie man es auf keinen Fall machen sollte, sieht man bei Prof84s Beitrag (das ist noch nicht einmal wohlgeformtes XML). Und eine Entscheidungshilfe zwischen den beiden Varianten, die du vorgeschlagen hast, habe ich dir an die Hand gegeben und die sagt: nimm die erste Variante.
    Insofern sind deine Fragen schon beantwortet und jetzt ist nur noch interessant, wie rüdiger Metadaten abspeichern würde wenn nicht so oder so ähnlich wie in XML. Da bin ich gespannt 🙂



  • @mimhem:
    😃 Wieso?



  • Na dann, Danke minhen 👍



  • Prof84 schrieb:

    @mimhem:
    😃 Wieso?

    Wenn du meinen Nick weder verstehst noch behalten kannst, kopier ihn doch einfach. Ich schreib dich ja auch richtig. Ansonsten ist dein Beispiel gewisserweise eine Mischung aus XML- und HTML-Syntax. In HTML konnte man bei Attributen die Anführungszeichen unter bestimmten Bedingungen weglassen - bei XML sind sie dagegen obligatorisch 😉



  • prof hat den code vom op kopiert, also war des ops code nich korrekt und nich profs 👎 👎 👎 👎



  • Spielt doch überhaupt keine Rolle. Er hat den fehlerhaften Code kopiert und überarbeitet ohne den Fehler zu merken und beim Überfliegen ist mir der Fehler eben bei Prof84 aufgefallen. Wo ist das Problem? 🙄

    rüdiger, darf ich aus dem Schweigen schließen, dass XML bei dir noch immer stinkt, weil es Attribute verwendet um Metadaten darstellen zu können, du aber auch keine bessere Idee hast?



  • minhen schrieb:

    rüdiger, darf ich aus dem Schweigen schließen, dass XML bei dir noch immer stinkt, weil es Attribute verwendet um Metadaten darstellen zu können, du aber auch keine bessere Idee hast?

    <daten><id>xy</id><foo>bar</foo></daten>
    

    dann hat man einen schönen Baum (wird vielleicht jetzt nicht so deutlich, weil ich mir Bezeichner aus den Fingern gezogen habe)

    daten
       /      \
    id=xy   foo=bar
    

    und dann kann man die Daten zB auch so ablegen

    daten:
      id: xy
      foo: bar
    

    oder gar so (wenn die Daten eh von Software generiert werden)

    daten:24:
      id:2: xy
      foo:3: bar
    

    Aber eigentlich habe ich keine Lust mich auf einen ewig langen Flamewar einzulassen.

    btw. ich bin kein XML-Hasser und benutze XML regelmäßig und auch mit "sophisticated" Technologien.



  • Eine äußerst dubiose Definition von Flamewar hast du da. Wenn du keine Lust hast über XML zu reden, dann fang doch einfach nicht an XML zu diskutieren.
    Aber zum Thema:

    <daten><id>xy</id><foo>bar</foo></daten>
    

    Wo ist jetzt dabei die Trennung zwischen Daten und Metadaten? Das schöne bei Attributen ist doch, dass man nicht auf die Semantik angewiesen ist, da Daten und Metadaten bereits syntaktisch getrennt sind. Dein Beispiel sieht mir so aus als ob man immer grundsätzlich dazusagen muss was Metadaten und was Daten sind - und zwar in z.B. der Dokumentation zum Format. Und das ist natürlich ziemlich schlecht.
    Oder versteh ich dich falsch? Denn dein letztes Beispiel mit den Zahlen ist mir ehrlich gesagt nicht geheuer. Für was stehen die Zahlen?



  • minhen schrieb:

    Eine äußerst dubiose Definition von Flamewar hast du da. Wenn du keine Lust hast über XML zu reden, dann fang doch einfach nicht an XML zu diskutieren.
    Aber zum Thema:

    <daten><id>xy</id><foo>bar</foo></daten>
    

    Wo ist jetzt dabei die Trennung zwischen Daten und Metadaten? Das schöne bei Attributen ist doch, dass man nicht auf die Semantik angewiesen ist, da Daten und Metadaten bereits syntaktisch getrennt sind. Dein Beispiel sieht mir so aus als ob man immer grundsätzlich dazusagen muss was Metadaten und was Daten sind - und zwar in z.B. der Dokumentation zum Format. Und das ist natürlich ziemlich schlecht.

    ups, foo und daten hätte ich natürlich tauschen sollen.

    dann eben

    <foo><meta><id>xy</id></meta> <daten>bar</daten></foo>
    

    Oder versteh ich dich falsch? Denn dein letztes Beispiel mit den Zahlen ist mir ehrlich gesagt nicht geheuer. Für was stehen die Zahlen?

    Die Zahlen stehen für die Bytes, die der Parser lesen muss. Das macht parsen ungemein leicht und sorgt dafür, das man keine besondere Syntax für Binärdaten braucht. Das war natürlich jetzt aus den Fingern gezogen. Solche Formate finde ich sehr praktisch und setze ich oft ein, vor allem wenn es um Ressourcen geht.



  • @minhen:

    2 Fragen:

    1. was bringt dir die Information ob ein Datum ein "Metadatum" oder ein "normales Datum" ist, wenn du das Datenmodell nicht kennst?
    2. wie würdest du mehrteilige Metadaten in XML darstellen, z.B. nen Vector oder auch was noch strukturierteres? Doch sicher nicht als
    <data metadata="1, 2">blubb</data>
    

    Die Frage ist ernst gemeint -- falls es in XML eine schöne Möglichkeit gibt das zu tun (ohne eben wieder eigene Parser für diese "strukturierten Strings" schreiben zu müssen), dann ist mir das bis jetzt einfach entgangen - ich bin auch ganz sicher kein XML Profi 😉



  • rüdiger: Ok, das ist eine Möglichkeit. Allerdings dachte ich es ginge dir um die Datenstruktur in die man ein Dokument packen kann. Also die Datenstuktur aus Sicht des konkreten Programmes. Und da verstehe ich nicht ganz, weswegen man XML-Attribute nicht auch in einen Baum packen können soll, speziell auch so:

    rüdiger schrieb:

    daten
       /      \
    id=xy   foo=bar
    

    Aber falls du jetzt das selbe denkst wie ich: ich gebe dir recht, das führt wohl zu nichts 😉

    hustbaer schrieb:

    1. was bringt dir die Information ob ein Datum ein "Metadatum" oder ein "normales Datum" ist, wenn du das Datenmodell nicht kennst?

    Na das ist genau in diesem Fall doch hilfreich. Wenn ich keine Ahnung vom Datenmodell habe, so kann ich auch als Maschine davon ausgehen, dass die relevanten Informationen im Taginhalt gespeichert sind. Was dir das genau bringt, hängt von der Anwendung ab. Der Punkt ist auf alle Fälle, dass man schon auf den ersten Blick Informationen erhält. Was ist wichtig, was ist unwichtig, wie ist es strukuriert. Ich muss das Datenmodell nicht kennen um Metadaten von Daten unterscheiden zu können und die logische Strutkur der Daten zu sehen.

    1. wie würdest du mehrteilige Metadaten in XML darstellen, z.B. nen Vector oder auch was noch strukturierteres? Doch sicher nicht als
    <data metadata="1, 2">blubb</data>
    

    Die Frage ist ernst gemeint -- falls es in XML eine schöne Möglichkeit gibt das zu tun (ohne eben wieder eigene Parser für diese "strukturierten Strings" schreiben zu müssen), dann ist mir das bis jetzt einfach entgangen - ich bin auch ganz sicher kein XML Profi 😉

    Was verstehst du unter Metadaten? Das sind eigentlich Daten über die Daten - und die kann ich im Fall der Fälle eben auch ignorieren ohne die eigentlich wichtigen Daten zu verlieren. Und genau das tritt eben ein, wenn ich das Datenmodell nicht kenne. Zugegeben normalerweise lässt man die Finger von unbekannten Formaten, aber XML ist für die digitale Ewigkeit ausgelegt. Und da ist es natürlich gut, wenn man solche Informationen bereits direkt anhand der Syntax sehen kann.


Anmelden zum Antworten