webentwicklung-frage-antwort-db.com.de

Sollte ich Elemente oder Attribute in XML verwenden?

Ich lerne über XML-Attribute von W3Schools .

Der Autor erwähnt Folgendes (Hervorhebung meines):

XML-Elemente vs. Attribute

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

Im ersten Beispiel ist Sex ein Attribut. In letzterer Hinsicht ist Sex ein Element. Beide Beispiele liefern die gleichen Informationen.

Es gibt keine Regeln, wann Attribute verwendet werden und wann Elemente verwendet werden. Attribute sind in HTML hilfreich. In XML empfehle ich, sie zu vermeiden. Verwenden Sie stattdessen Elemente. 

XML-Attribute vermeiden?

Einige Probleme bei der Verwendung von Attributen sind:

  • attribute dürfen nicht mehrere Werte enthalten (Elemente können)
  • attribute dürfen keine Baumstrukturen enthalten (Elemente können)
  • attribute sind nicht einfach erweiterbar (für zukünftige Änderungen)

Attribute sind schwer zu lesen und zu pflegen. Verwenden Sie Elemente für Daten. Verwenden Sie Attribute für Informationen, die für die Daten nicht relevant sind.

Ist die Ansicht des Autors also eine berühmte, oder ist dies die bewährte Methode in XML?

Sollten Attribute in XML vermieden werden?

W3Schools erwähnte auch Folgendes (Hervorhebung meines): 

XML-Attribute für Metadaten

Manchmal werden ID-Referenzen Elementen zugewiesen. Diese IDs können verwendet werden, um XML-Elemente auf ähnliche Weise wie das ID-Attribut in HTML zu identifizieren. Dieses Beispiel zeigt dies:

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

Die obige ID dient lediglich zur Identifikation der verschiedenen Notizen. Es ist nicht Teil der Notiz selbst.

Was ich hier sagen möchte, ist, dass Metadaten (Daten zu Daten) als Attribute gespeichert werden sollten und dass Daten selbst als Elemente gespeichert werden sollten.

62
Ibn Saeed

Die Verwendung von Attributen oder Elementen wird normalerweise von den Daten bestimmt, die Sie modellieren möchten.

Wenn zum Beispiel eine bestimmte EntitätTEILder Daten ist, ist es ratsam, sie zu einem Element zu machen. Zum Beispiel ist der Name des Mitarbeiters ein wesentlicher Bestandteil der Mitarbeiterdaten.

Wenn Sie jetztMETADATENüber Daten vermitteln möchten (etwas, das zusätzliche Informationen zu den Daten enthält), aber nicht wirklich Teil der Daten sind, ist es besser, sie zu einem Attribut zu machen. Nehmen wir an, jeder Mitarbeiter hat eine GUID, die für die Back-End-Verarbeitung erforderlich ist, und es ist dann besser, ein Attribut zu erstellen.

Es gibt keine Regel als solche, die besagt, dass etwas ein Attribut oder ein Element sein sollte.

Es ist nicht notwendig, Attribute um jeden Preis zu VERMEIDEN. Manchmal sind sie einfacher zu modellieren als Elemente. Das hängt wirklich von den Daten ab, die Sie darstellen möchten.

53
Prashanth

Nicht zuletzt ist es wichtig, dass das Einfügen von Attributen in Attribute weniger ausführliche XML-Informationen erfordert.

Vergleichen Sie

<person name="John" age="23" sex="m"/>

Gegen

<person>
    <name>
        John
    </name>
    <age>
        <years>
            23
        </years>
    </age>
    <sex>
        m
    </sex>
</person>

Ja, das war ein wenig voreingenommen und übertrieben, aber Sie haben den Punkt verstanden

19
flybywire

Mein 0.02 fünf Jahre nach dem OP ist das genaue Gegenteil. Lassen Sie mich erklären. 

  1. Verwenden Sie Elemente, wenn Sie ähnliche Daten und Attribute von diesen Daten gruppieren. 
  2. Verwenden Sie keine Elemente für alles. 
  3. Wenn sich die Daten wiederholen (1 bis viele), handelt es sich wahrscheinlich um ein Element
  4. Wenn sich die Daten nie wiederholen und nur dann sinnvoll sind, wenn sie mit __ etwas anderem korreliert sind, handelt es sich um ein Attribut.
  5. Wenn Daten keine anderen Attribute haben (d. H. Einen Namen), handelt es sich um ein Attribut
  6. Gruppieren Sie ähnliche Elemente, um das Parsing von Sammlungen zu unterstützen (d. H./Xml/character)
  7. Verwenden Sie ähnliche Elementnamen erneut, um das Analysieren von Daten zu unterstützen 
  8. Nie, ever, verwenden Sie Zahlen in Elementnamen, um die Position anzuzeigen. (d. h. Zeichen1, Zeichen2) Diese Praxis macht das Parsen sehr schwierig (siehe # 6, Code-Code muss/Zeichen1,/Zeichen2 usw.), nicht einfach/Zeichen.

Anders betrachtet:

  • Denken Sie zunächst an all Ihre Daten als Attribut.
  • Gruppieren Sie Attribute logisch in Elementen. Wenn Sie Ihre Daten kennen, müssen Sie das Attribut selten in ein Element konvertieren. Sie wissen wahrscheinlich bereits, wann ein Element (Erfassung oder wiederholte Daten) erforderlich ist
  • Gruppieren Sie Elemente logisch
  • Wenn Sie den Fall ausführen, den Sie erweitern müssen, fügen Sie neue Elemente/Attribute basierend auf der oben angegebenen logischen Struktur hinzu. Durch das Hinzufügen einer neuen Sammlung von untergeordneten Elementen wird Ihr Design nicht "beschädigt" und kann im Laufe der Zeit einfacher gelesen werden.

Wenn Sie beispielsweise eine einfache Sammlung von Büchern und Hauptfiguren betrachten, wird der Titel niemals "Kinder" haben, sondern ein einfaches Element. Jeder Charakter hat einen Namen und ein Alter.

    <book title='Hitchhiker&apos;s Guide to the Galaxy' author='Douglas Adams'>
        <character name='Zaphod Beeblebrox' age='100'/>
        <character name='Arthur Dent' age='42'/>
        <character name='Ford Prefect' age='182'/>
    </book>

    <book title='On the Road' author='Jack Kerouac'>
        <character name='Dean Moriarty' age='30'/>
        <character name='Old Bull Lee' age='42'/>
        <character name='Sal Paradise' age='42'/>
    </book>

Man könnte argumentieren, dass ein Buch mehrere Autoren haben könnte. OK, erweitern Sie einfach, indem Sie neue Autorenelemente hinzufügen (optional das ursprüngliche @author entfernen). Sicher, Sie haben die ursprüngliche Struktur gebrochen, aber in der Praxis ist das ziemlich selten und einfach zu umgehen. Jeder Benutzer Ihres ursprünglichen XML, der einen einzelnen Autor angenommen hat, muss sich trotzdem ändern (er ändert wahrscheinlich seine Datenbank, um den Autor aus einer Spalte in der "book" -Tabelle in eine "author" -Tabelle zu verschieben).

<book title='Hitchhiker&apos;s Guide to the Galaxy'>
    <author name='Douglas Adams'/>
    <author name='Some Other Guy'/>
    <character name='Zaphod Beeblebrox' age='100'/>
    <character name='Arthur Dent' age='42'>
    <character name='Ford Prefect' age='182'/>
</book>
18
William Walseth

Ich habe mit Google nach der genauen Frage gesucht. Zuerst bin ich zu diesem Artikel gekommen, http://www.ibm.com/developerworks/library/x-eleatt/index.html . Für eine einfache Frage als solche war es jedoch zu lang. Jedenfalls habe ich alle Antworten zu diesem Thema gelesen und keine zufriedenstellende Zusammenfassung gefunden. Daher ging ich auf den letzten Artikel zurück. Hier ist eine Zusammenfassung:

Wann verwende ich Elemente und wann verwende ich Attribute zum Darstellen von Informationen?

  • Wenn die betreffenden Informationen selbst mit Elementen versehen werden könnten, fügen Sie sie in ein Element ein.
  • Wenn die Informationen für ein Attributformular geeignet sind, aber möglicherweise mehrere Attribute desselben Namens für dasselbe Element enthalten, verwenden Sie stattdessen untergeordnete Elemente.
  • Wenn die Informationen in einem Standard-DTD-ähnlichen Attributtyp enthalten sein müssen, z. B. ID, IDREF oder ENTITY, verwenden Sie ein Attribut.
  • Wenn die Informationen nicht für Leerräume normalisiert werden sollen, verwenden Sie Elemente. ( XML-Prozessoren normalisieren Attribute auf eine Weise, die den Rohtext des Attributwerts ändern kann.)

Prinzip des Kerninhalts

Wenn Sie die betreffenden Informationen als Teil des .__ betrachten. Wesentliches Material, das im XML ausgedrückt oder kommuniziert wird, füge es in ein Element ein. Wenn Sie die Informationen als peripher betrachten oder nebenbei in der Hauptkommunikation, oder nur dazu gedacht, zu helfen Anwendungen verarbeiten die Hauptkommunikation, verwenden Attribute.

Prinzip der strukturierten Information

Wenn die Informationen in einer strukturierten Form ausgedrückt werden, insbesondere wenn Die Struktur kann erweiterbar sein, Elemente verwenden. Wenn die Information .__ ist. als atomares Token ausgedrückt, verwenden Sie Attribute.

Prinzip der Lesbarkeit

Wenn die Informationen von einer Person gelesen und verstanden werden sollen, Elemente verwenden. Wenn die Informationen am leichtesten verstanden werden und von einer Maschine verdaut, verwenden Sie Attribute.

Prinzip der Element-/Attribut-Bindung

Verwenden Sie ein Element, wenn der Wert von einem anderen .__ geändert werden soll. Attribut. [..] Es ist fast immer eine schreckliche Idee, ein Attribut ein anderes ändern zu lassen.

Dies ist eine kurze Zusammenfassung der wichtigen Punkte aus dem Artikel. Wenn Sie Beispiele und eine vollständige Beschreibung aller Fälle anzeigen möchten, lesen Sie den Originalartikel. 

10
Gajus

Attribute Modellzuordnung. Ein Satz von Attributen auf einem Element isomorphisiert direkt auf eine Namens-/Wert-Map, in der die Werte Text oder ein beliebiger serialisierbarer Werttyp sind. In C # kann beispielsweise jedes Dictionary<string, string>-Objekt als XML-Attributliste dargestellt werden und umgekehrt.

Dies gilt ausdrücklich nicht für Elemente. Während Sie eine Namens-/Wertekarte immer in eine Menge von Elementen umwandeln können, ist dies nicht umgekehrt, z. B .:

<map>
   <key1>value</key1>
   <key1>another value</key1>
   <key2>a third value</key2>
</map>

Wenn Sie dies in eine Map umwandeln, verlieren Sie zwei Dinge: die mehreren mit key1 verknüpften Werte und die Tatsache, dass key1 vor key2 angezeigt wird.

Die Bedeutung dieses Wertes wird viel deutlicher, wenn Sie sich den DOM-Code ansehen, der zum Aktualisieren von Informationen in einem solchen Format verwendet wird. Zum Beispiel ist es trivial, dies zu schreiben:

foreach (string key in map.Keys)
{
   mapElement.SetAttribute(key, map[key]);
}

Dieser Code ist kurz und eindeutig. Vergleichen Sie es mit, sagen Sie:

foreach (string key in map.Keys)
{
   keyElement = mapElement.SelectSingleNode(key);
   if (keyElement == null)
   {
      keyElement = mapElement.OwnerDocument.CreateElement(key);
      mapElement.AppendChild(keyElement);
   }
   keyElement.InnerText = value;
}
5
Robert Rossney

Sie können keine CDATA in ein Attribut einfügen. Meiner Erfahrung nach sollten Sie früher oder später einfache Anführungszeichen, doppelte Anführungszeichen und/oder ganze XML-Dokumente in ein "Mitglied" einfügen, und wenn es sich um ein Attribut handelt, werden Sie stattdessen auf die Person verfluchen, die Attribute verwendet von Elementen.

Hinweis: Meine Erfahrung mit XML bezog sich hauptsächlich auf die Bereinigung anderer Benutzer. Diese Leute schienen dem alten Sprichwort zu folgen "XML ist wie Gewalt. Wenn Sie Ihr Problem dadurch nicht gelöst haben, haben Sie nicht genug verwendet."

3
Coxy

Es hängt alles davon ab, wofür XML verwendet wird. Wenn es meistens um Interop zwischen Software und Maschinen geht - wie Web-Services - ist es einfacher, alle Elemente zu verwenden, wenn es nur aus Gründen der Konsistenz ist (und auch einige Frameworks bevorzugen es, z. B. WCF). Wenn es für den menschlichen Verzehr bestimmt ist, d. H. In erster Linie von Menschen erstellt und/oder gelesen wird, kann eine vernünftige Verwendung von Attributen die Lesbarkeit erheblich verbessern. XHTML ist ein vernünftiges Beispiel dafür und auch XSLT und XML-Schema.

3
Pavel Minaev

Ich arbeite normalerweise auf der Grundlage, dass Attribute Metadaten - dh Daten zu den Daten sind. Eine Sache, die ich vermeide, ist das Hinzufügen von Listen in Attributen. z.B. 

attribute="1 2 3 7 20"

Ansonsten haben Sie eine zusätzliche Ebene der Analyse, um jedes Element zu extrahieren. Wenn XML die Struktur und die Werkzeuge für Listen bereitstellt, warum sollten Sie sich selbst eine weitere auferlegen.

In einem Szenario, in dem Sie Attribute vorrangig kodieren möchten, ist die Verarbeitungsgeschwindigkeit über einen SAX-Parser. Mit einem SAX-Parser erhalten Sie einen Elementrückruf, der den Elementnamen und die Liste der Attribute enthält. Wenn Sie stattdessen mehrere Elemente verwendet haben, erhalten Sie mehrere Rückrufe (eines für jedes Element). Wie viel Belastung/Zeit dies ist, steht natürlich zur Debatte, ist aber vielleicht eine Überlegung wert.

3
Brian Agnew

Dies ist ein Beispiel, bei dem Attribute Daten zu Daten sind.

Datenbanken werden nach ihrem ID-Attribut benannt.

Das "type" -Attribut der Datenbank gibt an, was innerhalb des Datenbank-Tags erwartet wird.

  <databases>

      <database id='human_resources' type='mysql'>
        <Host>localhost</Host>
        <user>usrhr</user>
        <pass>jobby</pass>
        <name>consol_hr</name>
      </database>

      <database id='products' type='my_bespoke'>
        <filename>/home/anthony/products.adb</filename>
      </database>

  </databases>
2
Anthony Scaife

Die Punkte des Autors sind korrekt (mit der Ausnahme, dass Attribute eine Liste von Werten enthalten können). Die Frage ist, ob Sie sich für seine Punkte interessieren. 

Es liegt an dir.

2
John Saunders

Es ist wegen dieser Art von Müll, dass Sie w3schools vermeiden sollten. Wenn überhaupt, ist das noch schlimmer als das schreckliche Zeug über JavaScript.

Generell würde ich vorschlagen, dass der Inhalt, dh die Daten, von denen erwartet wird, dass sie von einem Endbenutzer verbraucht werden (sei dies ein menschliches Lesen oder ein Computer, der Informationen zur Verarbeitung erhält), am besten in einem Element enthalten sind. Metadaten - zum Beispiel eine ID, die einem Inhalt zugeordnet ist, aber nur für den internen Gebrauch bestimmt ist und nicht für den Endbenutzer angezeigt wird - sollten in einem Attribut enthalten sein.

0
NickFitz

Sie könnten das Problem wahrscheinlich auf eine semantische Weise sehen.

Wenn die Daten enger mit dem Element verknüpft sind, wäre dies ein Attribut. 

das heißt: eine ID eines Elements, ich würde es als Attribut des Elements setzen.

Es ist jedoch wahr, dass das Parsen eines Dokumentattributs mehr Kopfschmerzen als Elemente verursachen kann.

Alles hängt von Ihnen ab und wie Sie Ihr Schema entwerfen.

0
HyLian

Folgendes ist bei der Entscheidung für ein XML-Format zu beachten: Wenn ich mich richtig erinnere, dürfen die Werte von "id" -Attributen nicht alle numerisch sein, sondern müssen den Regeln für Namen in XML entsprechen. Und natürlich müssen die Werte einzigartig sein. Ich habe ein Projekt, das Dateien verarbeiten muss, die diese Anforderungen nicht erfüllen (obwohl sie in anderer Hinsicht sauberes XML sind), wodurch die Verarbeitung der Dateien schwieriger wurde.

0
Grimarr