XML: Attributes vs. Element Text

Wer sich viel mit datenzentrischen XML-Dokumenten auseinander setzt wird sich sicherlich schon einmal die Frage gestellt haben: Soll ich werte nun lieber als inneren Text eines Elements ablegen – oder lieber als Attribut? Was ist schlauer?

Zu dieser Frage habe ich nun eine durchaus lesenswerte Diskussion gefunden. Deren Kernaussage: Attribute haben die Nase vorn. Und zwar aus mehreren Gründen:

  • Attribute sind spezifischer, sie beschreiben Daten genauer. Das ist besonders dann eine große Hilfe, wenn man ein XML-Dokument programmtechnisch auswertet.
    Beispiel: Ich habe eine Liste von Personennamen, jeweils mit Vor- und Nachname. Ich kann die Daten in der List nun entweder so ablegen:

    <person>John Doe</person>

    oder so

    <person firstName="John" lastName="Doe" />

    Die erste Variante hat natürlich ein kürzeres XML zur Folge – allerdings auch einen hohen Spaßfaktor beim Versuch, die Liste möglichst simpel nach Nachnamen zu ordnen.

  • Der Einsatz von Attributen verringert die Anzahl von Knoten, die bei der Auswertung der Daten besucht werden müssen. Die Namensliste könnte ich nämlich auch so anlegen:

    <person>
      <firstName>John</firstName>
      <lastName>Doe</lastName>
    </person>

    Noch einmal das Gegenbeispiel mit Attributen:

    <person firstName="John" lastName="Doe" />

    Um nun Vor- und Nachnamen der Person zu ermitteln müssen beim ersten Beispiel fünf Knoten besucht werden (der innere Text eines XML-Elements ist nichts weiter als ein Knoten vom Typ Text), beim zweiten dagegen nur drei. Weniger Knoten = weniger Zeit.

  • Besitzt ein Element sowohl inneren Text als auch Kind-Elemente wird es eine Tortur, tatsächlich nur den gewünschten Text zu extrahieren. Den inneren Text eines Elements sollte man also nur dann zum Speichern von Daten benutzen, wenn das Element tatsächlich keine Kind-Elemente hat.

Zusammenfassung: Wer bei der XML-Modellierung auf Attribute baut, der hat die Nase vorn, sowohl performance-technisch als auch stilistisch ;-)

2 Kommentare

  1. Hi,
    wenn doch alles per Attribut “besser” ist, warum hat man dann beides eingeführt?

    Ich stelle jetzt mal folgendes in den Raum:

    Attribute sind z.B. unstrukturiert und ungeordnet, die Reihenfolge spielt also keine Rolle. Mit Attributen kann ich keine Kategorien bilden, was bei einer XPATH Filter Anfrage wiederum mehr Aufwand bedeuten würde, dass so viel heißt wie ich muss jedes einzelne Attribut abfragen wobei ich bei Elementen nur abfragen bräcute ob die Kategorie vorhanden ist (je nach XSL/DTD natürlich).

  2. Naja, dass mit Attributen tatsächlich “alles” besser wird, hab ich ja nicht behauptet :-) Der InnerText eines XML-Elements macht natürlich durchaus Sinn – z.B., wenn man dort “komplexe” Texte ablegen will.

    Zum Punkt “ungeordnet”: Das ist nur halb richtig, denke ich. Zum einen ist der Zugriff auf ein Element per Index/Position in meinen Augen sowieso eher fragwürdig: Ändere ich die Dokumentstruktur muss ich auch den verarbeitenden Code ändern – greife ich per Name auf den Wert eines Attributs zu stört mich eine Strukturänderung weniger. “Unstrukturiert” sind Attribute weiterhin nur dann, wenn man sich über das Dokumentenformat keinen Kopf macht.

    Aber was meinst du mit “Kategorien bilden”? Könntest du das evtl. nochmal etwas näher erklären?