Welches zu wählen: XML-Attribut oder Unterknoten?


15

Wir möchten einige Daten aus unserer Datenbank als XML exportieren. Zum Beispiel kann eine Personhaben kann age, nameund einige andere Eigenschaften.

Wir haben zwei Möglichkeiten, um das XML-Format zu definieren.

Wahl 1:

<Persons>
   <Person>
       <Age>16</Age>
       <Name>Richard</Name>
   </Person>
   <Person>
       <Age>34</Age>
       <Name>Eric</Name>
   </Person>
   ...
</Persons>

Wahl 2:

<Persons>
   <Person Age="16" Name="Richard"/>
   <Person Age="34" Name="Eric"/>
   ...
</Persons>

Was ist der Unterschied zwischen der Definition eines Unterknotens oder Attributs? Und was ist der Vorteil jeder Wahl?



2
Obwohl dies bei Stack Overflow im Jahr 2008 gefragt wurde , scheint dies eine Entwurfsentscheidung zu sein, die hier zum Thema gehört.
Thomas Owens

Antworten:


9

Es gibt keine eindeutige Dokumentation / Best Practice dafür, aber ziehen Sie die Alternativen in Betracht, da Sie Folgendes haben:

Als Elementtext:

  • Es kann einfacher sein, die Daten als XHTML usw. anzuzeigen, wobei der Textinhalt als Text und nicht als Markup oder Metadaten betrachtet wird.
  • es kann mehr als eine geben. Wenn Sie untergeordnete Inhalte mit mehreren Alters- oder Namenszeilen benötigen, lassen dies Attribute nicht zu
  • Wenn Sie Metadaten auf Zeilenebene benötigen, haben Sie die Möglichkeit, die Attribute von <name>oder <age>für diesen Zweck zu verwenden

Als Attribute:

  • Das XML ist kompakter
  • XSLT und DocTypes sind einfacher anzugeben
  • Sie müssen sich keine Gedanken über Leerzeichen (Auffüllen, Einrücken, Zeilenumbrüche) oder andere Elemente machen, die in PCDATA-Bereichen (Elementtext) eingefügt werden können (Kommentare, PIs).
  • es kann nur einen geben! Sie müssen sich nicht um untergeordnete Inhalte kümmern, die mehrere ageAttribute enthalten.

Ich habe viel Zeit mit XML verbracht, und meiner Meinung nach sollten für die reine Datenkommunikation Attribute verwendet werden, wann immer dies möglich ist. Wenn das XML wahrscheinlich für Präsentationen verwendet wird (XSLT, xhtml usw.), ist es möglicherweise besser als Textinhalt (aber nicht unbedingt).


2
Nichts wert: Wenn Sie XSLT verwenden, gibt es buchstäblich keinen Grund, Attribute NICHT zu verwenden. Vielleicht, wenn Sie eine XML + CSS-Sache machen würden, oder wenn Sie das XSLT einer anderen Person verwenden würden ...
DougM

Ich habe einige Punkte hinzugefügt, um Ihre gute Antwort ein wenig ausgewogener zu machen.
Doc Brown

9

Prinzipien des XML-Designs: Die Verwendung von Elementen im Vergleich zu Attributen von Uche Ogbuji von IBM ist wahrscheinlich eine der besten Ressourcen in diesem Bereich.

Der Kern der Entscheidung ist, dass Attribute erledigte Dinge sind. Sie können sie nicht ändern oder modifizieren oder verschachteln. Sie sind in der Reihenfolge unabhängig und unterscheiden sich innerhalb des Elements (Sie können nicht zwei gleiche Dinge haben).

Wenn sich eine dieser Einschränkungen möglicherweise ändert, machen Sie die Daten zu einem untergeordneten Knoten der XML.

In Ihrem Beispiel haben Sie eine Person, die einen Namen und ein Alter hat. Ich habe einen Vor-, einen Mittel- und einen Nachnamen ... und einen Spitznamen. Und manche Menschen haben Mädchennamen, mehrere Zweitnamen oder Ehrennamen - wie würden Sie John Ronald Reuel Tolkien in eine solche Struktur einfügen ?

Und so haben wir jemanden, der zwei zweite Vornamen hat, die eine Anweisung haben. Dies sollte deutlich machen, dass nein, ein Attribut hierfür nicht die beste Wahl ist.

Ich kann es derzeit nicht finden, aber in dem oben verlinkten Dokument gibt es eine Aussage, dass Namen Dinge sind, die ein wenig Nachdenken erfordern. Wenn jemand einen Hinweis dazu hat, hinterlasse bitte einen Kommentar oder bearbeite ihn an dieser Stelle.

Andererseits hat das Alter eine ziemlich feste Struktur (ich würde eher den Geburtstag als eine ganze Zahl vorschlagen). Daher ist die Darstellung dieser Informationen in einem bekannten und verständlichen Format in einem Attribut sinnvoll. Eine Person hat nur einen Geburtstag und es gibt keine "Bestellung", die Sie beibehalten möchten.

Uche Ogbuji nennt drei Grundprinzipien für das korrekte Entwerfen eines XML-Formats. Das Folgende sind abgekürzte Zitate aus dem oben verlinkten Dokument.

  • Prinzip der strukturierten Information
    Wenn die Information in strukturierter Form ausgedrückt wird, insbesondere wenn die Struktur erweiterbar sein kann, verwenden Sie Elemente. Auf der anderen Seite: Wenn die Informationen als atomares Token ausgedrückt werden, verwenden Sie Attribute
  • Prinzip der Lesbarkeit
    Wenn die Informationen von einer Person gelesen und verstanden werden sollen, verwenden Sie Elemente. Wenn die Informationen von einer Maschine am leichtesten verstanden und verarbeitet werden können, verwenden Sie Attribute.
  • Prinzip der Element- / Attributbindung
    Verwenden Sie ein Element, wenn der Wert durch ein anderes Attribut geändert werden soll

Und so sollten Namen Elemente sein - es handelt sich um strukturierte Daten, die kein atomares Token sind. Es ist wahrscheinlicher, dass sie von einem Menschen gelesen werden als von einem Computer, und sie können durch ein anderes Attribut im Namen selbst geändert werden.

Daten sollten Attribute sein - es handelt sich um Daten, die ein atomares Token sind. Es ist wahrscheinlicher, dass sie von einem Computer gelesen werden als von einem Menschen (und dann gegebenenfalls in das vom Menschen bevorzugte Format umgewandelt werden ), und letztendlich ist es unwahrscheinlich, dass sie von anderen geändert werden Attribute auf sie.


2

Eine weitere Überlegung von Beyong Rolfl ist die Anzahl der Felder.
Mehr als eine kleine Anzahl von Attributen wird zu einem Chaos und ist schwer zu lesen (vorausgesetzt, Sie möchten, dass Ihre XML von Menschen gelesen werden kann, aber als Programmierer möchten Sie dies zumindest zum Testen tun).

Wenn Sie erwarten, dass sich die Datenstruktur eines der Felder mit der Zeit ändert, machen Sie es nicht zu einem Attribut.
Zum Beispiel Ihr Namensfeld. Vielleicht würde das in Zukunft so werden

<name>
  <firstName>George</firstName>
  <lastName>Orwell</lastName>
  <maidenName></maidenName>
  <nickName>Robert</nickName>
</name>

Wenn Sie damit rechnen, dass so etwas passieren wird, bedeutet dies, dass Sie später mehr Code umgestalten müssen.


Danke für diesen guten Punkt. Und warum bedeutet "es zu einem Attribut zu machen, später mehr Code umzugestalten"?
ZijingWu

2

Für das Personen-Tag ist es normal, dass mehr Personen-Tags vorhanden sind. Es ist sinnvoll, dass eine Liste von Personen Entitäten und keine Attribute enthält.

Die Geschichte ist für Person und seine Bestandteile unterschiedlich. Eine Person enthält keinen Namen, der Name ist ein Attribut der Person, daher bleibe ich bei Attributen anstelle von neuen Tags. Tags sind nützlich, wenn Sie sich wiederholende Dinge wie Adressen haben und dies nicht mit Attributen tun können.

Wenn wir im HTML-Kontext denken, haben Sie keine Eingabe mit einem Namensschild mit einem Wert, oder?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.