70 Stimmen

XML-Attribute vs. Elemente

Wann sollten Sie XML-Attribute und wann sollten Sie XML-Elemente verwenden?

z.B..

<customData>
  <records>
    <record name="foo" description="bar" />
  </records>
</customData>

oder

<customData>
  <records>
    <record>
      <name>foo</name>
      <description>bar</description>
    </record>
  </records>
</customData>

38voto

Ryan Taylor Punkte 8610

Es gibt einen Artikel mit dem Titel " Grundsätze des XML-Designs: Wann man Elemente und wann man Attribute verwendet " auf der IBM-Website.

Auch wenn es nicht viele feste Regeln zu geben scheint, werden in dem Beitrag einige gute Leitlinien genannt. Eine der Empfehlungen lautet beispielsweise, Elemente zu verwenden, wenn Ihre Daten nicht auf Leerraum normalisiert werden dürfen, da XML-Prozessoren Daten innerhalb eines Attributs normalisieren und dadurch den Rohtext verändern können.

Ich beziehe mich von Zeit zu Zeit auf diesen Artikel, wenn ich verschiedene XML-Strukturen entwickle. Hoffentlich ist er auch für andere hilfreich.

edit - Von der Website:

Prinzip des Kerninhalts

Wenn Sie die betreffende Information als Teil des wesentlichen Materials betrachten, das in der XML-Datei ausgedrückt oder übermittelt wird, fügen Sie sie in ein Element ein. Bei für den Menschen lesbaren Dokumenten bedeutet dies im Allgemeinen den Kerninhalt, der dem Leser mitgeteilt wird. Bei maschinenorientierten Datensatzformaten handelt es sich im Allgemeinen um die Daten, die direkt aus dem Problembereich stammen. Wenn Sie der Meinung sind, dass die Informationen peripher oder beiläufig zur Hauptkommunikation sind oder lediglich dazu dienen, Anwendungen bei der Verarbeitung der Hauptkommunikation zu unterstützen, verwenden Sie Attribute. Auf diese Weise wird vermieden, dass der Kerninhalt mit Zusatzmaterial überfrachtet wird. Für maschinenorientierte Datensatzformate bedeutet dies im Allgemeinen anwendungsspezifische Notationen zu den Hauptdaten aus dem Problembereich.

Ich habe zum Beispiel viele XML-Formate gesehen, die in der Regel von Unternehmen selbst entwickelt wurden und bei denen der Titel des Dokuments in einem Attribut enthalten war. Meiner Meinung nach ist ein Titel ein so grundlegender Bestandteil der Kommunikation eines Dokuments, dass er immer im Elementinhalt stehen sollte. Andererseits habe ich oft Fälle gesehen, in denen interne Produktkennungen als Elemente in beschreibende Datensätze des Produkts eingefügt wurden. In einigen dieser Fälle waren Attribute besser geeignet, da der spezifische interne Produktcode für die meisten Leser oder Bearbeiter des Dokuments nicht von primärem Interesse war, insbesondere wenn die Kennung ein sehr langes oder undurchschaubares Format hatte.

Sie haben vielleicht schon einmal den Grundsatz gehört, dass Daten in Elemente und Metadaten in Attribute gehören. Die beiden obigen Absätze drücken eigentlich dasselbe Prinzip aus, allerdings in einer bewussteren und weniger unscharfen Sprache.

Grundsatz der strukturierten Information

Wenn die Information in strukturierter Form ausgedrückt wird, insbesondere wenn die Struktur erweiterbar ist, sollten Elemente verwendet werden. Andererseits: Wenn die Information als atomares Token ausgedrückt wird, verwenden Sie Attribute. Elemente sind der erweiterbare Motor für den Ausdruck von Struktur in XML. Fast alle XML-Verarbeitungstools sind auf diese Tatsache ausgerichtet, und wenn Sie strukturierte Informationen richtig in Elemente zerlegen, werden Sie feststellen, dass Ihre Verarbeitungstools Ihr Design ergänzen und dass Sie dadurch an Produktivität und Wartbarkeit gewinnen. Attribute sind dazu gedacht, einfache Eigenschaften der in einem Element dargestellten Informationen auszudrücken. Wenn Sie der grundlegenden Architektur von XML zuwiderhandeln, indem Sie strukturierte Informationen in Attribute zwängen, gewinnen Sie vielleicht ein wenig Zeitersparnis und Bequemlichkeit, aber Sie werden wahrscheinlich mit Wartungskosten bezahlen.

Datteln sind ein gutes Beispiel: Ein Datum hat eine feste Struktur und fungiert im Allgemeinen als einzelnes Token, so dass es als Attribut sinnvoll ist (vorzugsweise in ISO-8601 ausgedrückt). Die Darstellung von Personennamen hingegen ist ein Fall, bei dem ich erlebt habe, dass dieses Prinzip die Designer überrascht hat. Ich sehe oft Namen in Attributen, aber ich habe immer dafür plädiert, dass Personennamen im Elementinhalt stehen sollten. Ein Personenname hat eine überraschend variable Struktur (in manchen Kulturen kann man Verwirrung oder Beleidigung stiften, indem man Ehrentitel weglässt oder eine bestimmte Reihenfolge der Namensteile annimmt). Ein Personenname ist auch selten ein atomares Token. So kann es beispielsweise vorkommen, dass Sie nach einem Vornamen und manchmal nach einem Nachnamen suchen oder sortieren möchten. Ich sollte darauf hinweisen, dass es ebenso problematisch ist, einen vollständigen Namen in den Inhalt eines einzelnen Elements zu zwängen, wie ihn in ein Attribut zu packen.

17voto

Jon Skeet Punkte 1325502

Ich persönlich mag die Verwendung von Attributen für einfache Eigenschaften mit einem Wert. Elemente sind (natürlich) besser für komplexe Typen oder wiederholte Werte geeignet.

Bei einwertigen Eigenschaften führen Attribute zu kompakterem XML und einer einfacheren Adressierung in den meisten APIs.

17voto

skaffman Punkte 389758

Eines der besser durchdachten Argumente zwischen Element und Attribut stammt aus der UK GovTalk-Leitlinien . Darin werden die Modellierungstechniken für den behördlichen XML-Austausch definiert, aber es steht für sich allein und ist eine Überlegung wert.

Schemata MÜSSEN entworfen werden Elemente die Hauptträger von Informationsinhalte in den XML Instanzen sind. Attribute sind besser geeignet für die Aufnahme zusätzlicher Metadaten - einfache Elemente, die weitere Informationen über den Inhalt des Elements. Attribute MÜSSEN NICHT verwendet werden, um andere Attribute zu qualifizieren, wenn dies zu Mehrdeutigkeit führen könnte.

Im Gegensatz zu Elementen, Attribu keine strukturierten Daten enthalten. Aus diesem Grund werden [ ] Hauptträger von Informationen Inhalt. Wenn jedoch die Verwendung von Attributen zur Aufnahme von Metadaten über ein Element (zum Beispiel die Format eines Datums, eine Maßeinheit oder die Identifizierung einer Wertemenge) kann ein Instanzdokument einfacher machen und leichter zu verstehen.

Ein Geburtsdatum kann in einer Nachricht als:

 <DateOfBirth>1975-06-03</DateOfBirth> 

Es könnten jedoch mehr Informationen erforderlich sein, z. B. wie das Datum der Geburtsdatum überprüft wurde. [ ] als Attribut definiert werden, wodurch das Element in einer Nachricht wie folgt aussehen:

<DateOfBirth VerifiedBy="View of Birth Certificate">1975-06-03</DateOfBirth> 

Das Folgende wäre unangemessen:

<DateOfBirth VerifiedBy="View of Birth Certificate" ValueSet="ISO 8601" Code="2">1975-06-03</DateOfBirth>   

Es ist hier nicht klar, ob qualifiziert die ValueSet-Attribut qualifiziert. Eine angemessenere Wiedergabe würde lauten:

 <DateOfBirth>    
   <VerifiedBy Code="2">View of Birth Certificate</VerifiedBy>     
   <Value ValueSet="ISO 8601">1975-06-03</Value>
 </DateOfBirth>

7voto

Rory Becker Punkte 15461

Das ist weitgehend eine Frage der Vorliebe. Ich verwende Elemente für die Gruppierung und Attribute für Daten, wo dies möglich ist, da ich dies für kompakter halte als die Alternative.

Ich bevorzuge zum Beispiel.....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person name="Rory" surname="Becker" age="30" />
        <person name="Travis" surname="Illig" age="32" />
        <person name="Scott" surname="Hanselman" age="34" />
    </people>
</data>

...Statt....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person>
            <name>Rory</name>
            <surname>Becker</surname>
            <age>30</age>
        </person>
        <person>
            <name>Travis</name>
            <surname>Illig</surname>
            <age>32</age>
        </person>
        <person>
            <name>Scott</name>
            <surname>Hanselman</surname>
            <age>34</age>
        </person>
    </people>
</data>

Allerdings, wenn ich Daten, die nicht leicht innerhalb von sagen wir 20-30 Zeichen darstellen oder enthält viele Anführungszeichen oder andere Zeichen, die escaping dann würde ich sagen, es ist Zeit, die Elemente zu brechen ... möglicherweise mit CData Blöcke.

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person name="Rory" surname="Becker" age="30" >
            <comment>A programmer whose interested in all sorts of misc stuff. His Blog can be found at http://rorybecker.blogspot.com and he's on twitter as @RoryBecker</comment>
        </person>
        <person name="Travis" surname="Illig" age="32" >
            <comment>A cool guy for who has helped me out with all sorts of SVn information</comment>
        </person>
        <person name="Scott" surname="Hanselman" age="34" >
            <comment>Scott works for MS and has a great podcast available at http://www.hanselminutes.com </comment>
        </person>
    </people>
</data>

7voto

Dan Punkte 891

In der Regel vermeide ich Attribute ganz und gar. Ja, Attribute sind kompakter, aber Elemente sind flexibler, und Flexibilität ist einer der wichtigsten Vorteile der Verwendung eines Datenformats wie XML. Was heute ein einzelner Wert ist, kann morgen eine Liste von Werten sein.

Und wenn alles ein Element ist, müssen Sie sich nie daran erinnern, wie Sie eine bestimmte Information modelliert haben. Der Verzicht auf Attribute bedeutet, dass Sie eine Sache weniger zu bedenken haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X