Bei der Arbeit werden wir aufgefordert, XML-Dateien zu erstellen, um Daten an eine andere Offline-Anwendung zu übergeben. Diese erstellt dann eine zweite XML-Datei, die zurückgegeben werden muss, um einige unserer Daten zu aktualisieren. Während des Prozesses haben wir mit dem Team der anderen Anwendung über die Struktur der XML-Datei gesprochen.
Das Beispiel, das ich mir ausgedacht habe, ist im Wesentlichen so etwas wie:
<INVENTORY>
<ITEM serialNumber="something" location="something" barcode="something">
<TYPE modelNumber="something" vendor="something"/>
</ITEM>
</INVENTORY>
Das andere Team sagte, dass dies kein Industriestandard sei und dass Attribute nur für Metadaten verwendet werden sollten. Sie schlugen vor:
<INVENTORY>
<ITEM>
<SERIALNUMBER>something</SERIALNUMBER>
<LOCATION>something</LOCATION>
<BARCODE>something</BARCODE>
<TYPE>
<MODELNUMBER>something</MODELNUMBER>
<VENDOR>something</VENDOR>
</TYPE>
</ITEM>
</INVENTORY>
Der Grund, warum ich den ersten vorgeschlagen habe, ist, dass die Größe der erstellten Datei viel kleiner ist. Während der Übertragung befinden sich ungefähr 80000 Elemente in der Datei. Ihr Vorschlag in Wirklichkeit ist dreimal so groß wie der von mir vorgeschlagene. Ich suchte nach dem mysteriösen "Industriestandard", der erwähnt wurde, aber am ehesten konnte ich feststellen, dass XML-Attribute nur für Metadaten verwendet werden sollten, sagte aber, dass es in der Debatte um Metadaten ging.
Wie bestimmen Sie nach der langwierigen Erklärung (sorry), was Metadaten sind, und wie sollten Sie beim Entwerfen der Struktur eines XML-Dokuments entscheiden, wann ein Attribut oder ein Element verwendet werden soll?
Antworten:
Ich benutze diese Faustregel:
Ihre ist also nah. Ich hätte so etwas gemacht wie:
BEARBEITEN : Das ursprüngliche Beispiel wurde basierend auf dem unten stehenden Feedback aktualisiert.
quelle
<
is<
ist eine Zeichenreferenz und keine Entitätsreferenz.<
ist in Attributen OK. Siehe: w3.org/TR/REC-xml/#sec-predefined-ent]]>
!)Einige der Probleme mit Attributen sind:
Wenn Sie Attribute als Container für Daten verwenden, erhalten Sie Dokumente, die schwer zu lesen und zu pflegen sind. Versuchen Sie, Elemente zur Beschreibung von Daten zu verwenden. Verwenden Sie Attribute nur, um Informationen bereitzustellen, die für die Daten nicht relevant sind.
Beenden Sie nicht so (so sollte XML nicht verwendet werden):
Quelle: http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp
quelle
list
eine teilweise Problemumgehung für dieses Problem darstellt. Es können nicht mehrere Attribute mit demselben Namen vorhanden sein. Mitlist
Attribut hat immer noch nur einen Wert, nämlich eine durch Leerzeichen getrennte Liste einiger Datentypen. Trennzeichen sind festgelegt, sodass Sie nicht mehrere Werte haben können, wenn ein einzelner Wert des gewünschten Datentyps Leerzeichen enthalten kann. Dies schließt die Wahrscheinlichkeit aus, dass beispielsweise mehrere Adressen in einem "Adress" -Attribut enthalten sind."XML" steht für "eXtensible Markup Language". Eine Auszeichnungssprache bedeutet, dass es sich bei den Daten um Text handelt, der mit Metadaten zur Struktur oder Formatierung gekennzeichnet ist.
XHTML ist ein Beispiel für XML, das so verwendet wurde, wie es beabsichtigt war:
Hier ist die Unterscheidung zwischen Elementen und Attributen klar. Textelemente werden im Browser angezeigt und Attribute sind Anweisungen , wie sie angezeigt werden (obwohl es ein paar Tags sind , die nicht auf diese Weise funktionieren).
Verwirrung entsteht, wenn XML nicht als Auszeichnungssprache, sondern als Datenserialisierungssprache verwendet wird, in der die Unterscheidung zwischen "Daten" und "Metadaten" vager ist. Die Wahl zwischen Elementen und Attributen ist also mehr oder weniger willkürlich, mit Ausnahme von Dingen, die nicht mit Attributen dargestellt werden können (siehe die Antwort von Feenster).
quelle
XML-Element gegen XML-Attribut
Bei XML dreht sich alles um Übereinstimmung. Wenden Sie sich zunächst an vorhandene XML-Schemas oder etablierte Konventionen in Ihrer Community oder Branche.
Wenn Sie wirklich in der Lage sind, Ihr Schema von Grund auf zu definieren, finden Sie hier einige allgemeine Überlegungen, die die Entscheidung zwischen Element und Attribut beeinflussen sollten :
quelle
Dies kann von Ihrer Verwendung abhängen. XML, das zur Darstellung strukturierter Daten verwendet wird, die aus einer Datenbank generiert wurden, funktioniert möglicherweise gut, wenn letztendlich Feldwerte als Attribute platziert werden.
XML, das als Nachrichtentransport verwendet wird, ist jedoch häufig besser, wenn mehr Elemente verwendet werden.
Nehmen wir zum Beispiel an, wir hätten dieses XML wie in der Antwort vorgeschlagen: -
Jetzt möchten wir das ITEM-Element an ein Gerät senden, um den Barcode zu drucken. Es gibt jedoch eine Auswahl an Codierungstypen. Wie stellen wir den erforderlichen Codierungstyp dar? Plötzlich stellen wir etwas verspätet fest, dass der Barcode kein einzelner automatischer Wert war, sondern möglicherweise mit der beim Drucken erforderlichen Codierung qualifiziert ist.
Der Punkt ist, wenn Sie nicht eine Art XSD oder DTD zusammen mit einem Namespace erstellen, um die Struktur in Stein zu fixieren, können Sie am besten Ihre Optionen offen lassen.
IMO XML ist am nützlichsten, wenn es gebogen werden kann, ohne vorhandenen Code damit zu beschädigen.
quelle
In meinem Schemaentwurf verwende ich die folgenden Richtlinien in Bezug auf Attribute und Elemente:
Die Präferenz für Attribute ist, dass sie Folgendes bietet:
Ich habe hinzugefügt, wenn dies technisch möglich ist, da es Zeiten gibt, in denen die Verwendung von Attributen nicht möglich ist. Zum Beispiel Attributsatzauswahl. Beispielsweise ist die Verwendung von (startDate und endDate) xor (startTS und endTS) mit der aktuellen Schemasprache nicht möglich
Wenn das XML-Schema zulässt, dass das Inhaltsmodell "Alle" eingeschränkt oder erweitert wird, würde ich es wahrscheinlich löschen
quelle
Im Zweifelsfall KISS - warum Attribute und Elemente mischen, wenn Sie keinen klaren Grund haben, Attribute zu verwenden. Wenn Sie sich später für die Definition einer XSD entscheiden, wird diese ebenfalls sauberer. Wenn Sie sich dann noch später dazu entschließen, eine Klassenstruktur aus Ihrer XSD zu generieren, ist dies ebenfalls einfacher.
quelle
Es gibt keine universelle Antwort auf diese Frage (ich war stark an der Erstellung der W3C-Spezifikation beteiligt). XML kann für viele Zwecke verwendet werden - textähnliche Dokumente, Daten und deklarativer Code sind drei der häufigsten. Ich benutze es auch oft als Datenmodell. Es gibt Aspekte dieser Anwendungen, bei denen Attribute häufiger vorkommen, und andere, bei denen untergeordnete Elemente natürlicher sind. Es gibt auch Funktionen verschiedener Tools, die die Verwendung einfacher oder schwieriger machen.
XHTML ist ein Bereich, in dem Attribute eine natürliche Verwendung haben (z. B. in class = 'foo'). Attribute haben keine Reihenfolge und dies kann es einigen Leuten erleichtern, Werkzeuge zu entwickeln. OTOH-Attribute sind ohne Schema schwerer einzugeben. Ich finde auch, dass Namespace-Attribute (foo: bar = "zork") in verschiedenen Toolsets oft schwieriger zu verwalten sind. Schauen Sie sich jedoch einige der W3C-Sprachen an, um die übliche Mischung zu sehen. SVG, XSLT, XSD, MathML sind einige Beispiele für bekannte Sprachen und alle verfügen über ein reichhaltiges Angebot an Attributen und Elementen. Einige Sprachen erlauben sogar mehr als eine Möglichkeit, dies zu tun, z
oder
Beachten Sie, dass diese syntaktisch NICHT gleichwertig sind und explizite Unterstützung in Verarbeitungswerkzeugen erfordern.
Mein Rat wäre, einen Blick auf die gängige Praxis in dem Bereich zu werfen, der Ihrer Anwendung am nächsten liegt, und zu überlegen, welche Toolsets Sie möglicherweise anwenden möchten.
Stellen Sie schließlich sicher, dass Sie Namespaces von Attributen unterscheiden. Einige XML-Systeme (z. B. Linq) repräsentieren Namespaces als Attribute in der API. IMO das ist hässlich und möglicherweise verwirrend.
quelle
Andere haben behandelt, wie man Attribute von Elementen unterscheidet, aber aus einer allgemeineren Perspektive ist es falsch, alles in Attribute zu setzen, weil dadurch das resultierende XML kleiner wird.
XML ist nicht kompakt, sondern portabel und für den Menschen lesbar. Wenn Sie die Größe der übertragenen Daten verringern möchten, verwenden Sie etwas anderes (z. B. die Protokollpuffer von Google ).
quelle
die Millionen-Dollar-Frage!
Machen Sie sich jetzt zunächst keine allzu großen Sorgen um die Leistung. Sie werden erstaunt sein, wie schnell ein optimierter XML-Parser Ihre XML-Datei durchsucht. Was ist Ihr Design für die Zukunft? Wie werden Sie im Zuge der Weiterentwicklung des XML die lose Kopplung und Interoperabilität aufrechterhalten?
Konkreter können Sie das Inhaltsmodell eines Elements komplexer gestalten, es ist jedoch schwieriger, ein Attribut zu erweitern.
quelle
Beide Methoden zum Speichern der Objekteigenschaften sind vollkommen gültig. Sie sollten von pragmatischen Überlegungen abweichen. Versuchen Sie folgende Frage zu beantworten:
Welche Darstellung führt zu einer schnelleren Datenanalyse / -generierung?
Welche Darstellung führt zu einer schnelleren Datenübertragung?
Ist Lesbarkeit wichtig?
...
quelle
Verwenden Sie Elemente für Daten und Attribute für Metadaten (Daten zu den Daten des Elements).
Wenn ein Element in Ihren ausgewählten Zeichenfolgen als Prädikat angezeigt wird, haben Sie ein gutes Zeichen dafür, dass es ein Attribut sein sollte. Wenn ein Attribut niemals als Prädikat verwendet wird, sind es möglicherweise keine nützlichen Metadaten.
Denken Sie daran, dass XML maschinenlesbar und nicht von Menschen lesbar sein soll und dass XML für große Dokumente sehr gut komprimiert wird.
quelle
Es ist so oder so fraglich, aber Ihre Kollegen haben Recht in dem Sinne, dass das XML für "Markup" oder Metadaten um die tatsächlichen Daten verwendet werden sollte. Sie haben Recht, dass es manchmal schwierig ist zu entscheiden, wo die Grenze zwischen Metadaten und Daten liegt, wenn Sie Ihre Domain in XML modellieren. In der Praxis tue ich so, als ob alles im Markup versteckt wäre und nur die Daten außerhalb des Markups lesbar sind. Ist das Dokument auf diese Weise sinnvoll?
XML ist notorisch sperrig. Für Transport und Lagerung wird die Komprimierung dringend empfohlen, wenn Sie sich die Rechenleistung leisten können. XML wird aufgrund seiner Wiederholbarkeit gut, manchmal phänomenal gut komprimiert. Ich habe große Dateien auf weniger als 5% ihrer ursprünglichen Größe komprimieren lassen.
Ein weiterer Punkt, um Ihre Position zu stärken, ist, dass Sie, während das andere Team über den Stil argumentiert (da die meisten XML-Tools ein Dokument mit allen Attributen genauso einfach handhaben wie ein Dokument mit allen # PCDATA-Dokumenten), über praktische Aspekte streiten. Während Stil nicht völlig ignoriert werden kann, sollten technische Vorzüge mehr Gewicht haben.
quelle
Es ist größtenteils eine Frage der Präferenz. Ich verwende Elemente zum Gruppieren und Attribute für Daten, wo dies möglich ist, da ich dies als kompakter als die Alternative betrachte.
Zum Beispiel bevorzuge ich .....
...Anstatt....
Wenn ich jedoch Daten habe, die sich nicht leicht innerhalb von beispielsweise 20 bis 30 Zeichen darstellen lassen oder viele Anführungszeichen oder andere Zeichen enthalten, die maskiert werden müssen, würde ich sagen, dass es Zeit ist, die Elemente aufzubrechen ... möglicherweise mit CData-Blöcken.
quelle
Wie wäre es, wenn Sie unsere hart erarbeitete Intuition zur Objektorientierung nutzen? Normalerweise finde ich es einfach zu denken, welches ein Objekt und welches ein Attribut des Objekts ist oder auf welches Objekt es sich bezieht.
Was als Objekte intuitiv sinnvoll ist, soll als Element passen. Seine Attribute (oder Eigenschaften) wären Attribute für diese Elemente in XML oder ein untergeordnetes Element mit Attribut.
Ich denke, für einfachere Fälle wie im Beispiel funktioniert die Objektorientierungsanalogie in Ordnung, um herauszufinden, welches Element und welches Attribut eines Elements ist.
quelle
Nur ein paar Korrekturen an einigen schlechten Informationen:
@ John Ballinger: Attribute können beliebige Zeichendaten enthalten. <> & "'muss in & lt; & gt; & amp; & quot; bzw. & apos; maskiert werden. Wenn Sie eine XML-Bibliothek verwenden, wird dies für Sie erledigt.
Zum Teufel, ein Attribut kann Binärdaten wie ein Bild enthalten, wenn Sie es wirklich wollen, indem Sie es einfach mit base64 codieren und zu einer Daten-URL machen.
@feenster: Attribute können bei IDS oder NAMES durch Leerzeichen getrennte mehrere Elemente enthalten, die Zahlen enthalten würden. Nitpicky, aber das kann Platz sparen.
Durch die Verwendung von Attributen kann XML mit JSON konkurrenzfähig bleiben. Siehe Fat Markup: Den Fat Markup-Mythos kalorienreduzieren .
quelle
Ich bin immer wieder überrascht über die Ergebnisse dieser Art von Diskussionen. Für mich gibt es eine sehr einfache Regel, um zu entscheiden, ob Daten zu einem Attribut oder als Inhalt gehören und ob die Daten eine navigierbare Unterstruktur haben.
So gehört beispielsweise Nicht-Markup-Text immer zu Attributen. Immer.
Listen gehören in Unterstruktur oder Inhalt. Text, der im Laufe der Zeit eingebettete strukturierte Unterinhalte enthalten kann, gehört zum Inhalt. (Nach meiner Erfahrung gibt es relativ wenig davon - Text mit Markup -, wenn XML zum Speichern oder Austauschen von Daten verwendet wird.)
Das so geschriebene XML-Schema ist prägnant.
Wann immer ich Fälle wie
<car><make>Ford</make><color>Red</color></car>
sehe, denke ich mir: "Hat der Autor gedacht, dass es Unterelemente innerhalb des make-Elements geben würde?"<car make="Ford" color="Red" />
ist deutlich besser lesbar, es gibt keine Frage, wie Leerzeichen behandelt werden würden usw.Angesichts der Regeln für die Behandlung von Leerzeichen glaube ich, dass dies die klare Absicht der XML-Designer war.
quelle
Dies ist in HTML sehr deutlich, wo die Unterschiede zwischen Attributen und Markups deutlich erkennbar sind:
Wenn Sie nur reine Daten als XML haben, gibt es einen weniger deutlichen Unterschied. Daten können zwischen Markup oder als Attribute stehen.
=> Die meisten Daten sollten zwischen Markup stehen.
Wenn Sie hier Attribute verwenden möchten: Sie können Daten in zwei Kategorien einteilen: Daten und "Metadaten", wobei Metadaten nicht Teil des Datensatzes sind, den Sie präsentieren möchten, aber Dinge wie "Formatversion", "Erstellungsdatum". , etc.
Man könnte auch sagen: "Verwenden Sie Attribute, um das Tag zu charakterisieren, verwenden Sie Tags, um Daten selbst bereitzustellen."
quelle
Ich stimme Feenster zu. Halte dich von Attributen fern, wenn du kannst. Elemente sind evolutionär und interoperabler zwischen Web-Service-Toolkits. Sie würden diese Toolkits niemals finden, die Ihre Anforderungs- / Antwortnachrichten mithilfe von Attributen serialisieren. Dies ist auch sinnvoll, da unsere Nachrichten Daten (keine Metadaten) für ein Webdienst-Toolkit sind.
quelle
Attribute können im Laufe der Zeit leicht schwierig zu verwalten sein. Vertrauen Sie mir. Ich halte mich immer persönlich von ihnen fern. Elemente sind viel expliziter und sowohl für Parser als auch für Benutzer lesbar / verwendbar.
Ich habe sie nur verwendet, um die Dateierweiterung einer Asset-URL zu definieren:
Ich denke, wenn Sie 100% wissen, dass das Attribut nicht erweitert werden muss, können Sie sie verwenden, aber wie oft wissen Sie das.
quelle