Quand devez-vous utiliser des attributs XML et quand devez-vous utiliser des éléments XML?
par exemple.
<customData>
<records>
<record name="foo" description="bar" />
</records>
</customData>
ou
<customData>
<records>
<record>
<name>foo</name>
<description>bar</description>
</record>
</records>
</customData>
Il existe un article intitulé " Principes de conception XML: quand utiliser les éléments par rapport aux attributs " sur le site Web d'IBM.
Bien qu'il ne semble pas y avoir beaucoup de règles dures et rapides, il y a quelques bonnes directives mentionnées dans la publication. Par exemple, l'une des recommandations consiste à utiliser des éléments lorsque vos données ne doivent pas être normalisées pour les espaces blancs, car les processeurs XML peuvent normaliser les données dans un attribut, modifiant ainsi le texte brut.
Je me retrouve de temps en temps à faire référence à cet article alors que je développe diverses structures XML. J'espère que cela sera également utile aux autres.
modifier - Depuis le site:
Principe du contenu de base
Si vous considérez que les informations en question font partie du matériel essentiel qui est exprimé ou communiqué dans le XML, mettez-le dans un élément. Pour les documents lisibles par l'homme, cela signifie généralement le contenu de base qui est communiqué au lecteur. Pour les formats d'enregistrements orientés machine, cela signifie généralement que les données proviennent directement du domaine problématique. Si vous considérez que les informations sont périphériques ou accessoires à la communication principale, ou purement destinées à aider les applications à traiter la communication principale, utilisez des attributs. Cela évite d'encombrer le contenu de base avec un matériau auxiliaire. Pour les formats d'enregistrements orientés machine, cela signifie généralement des notations spécifiques à l'application sur les données principales du domaine problématique.
Par exemple, j'ai vu de nombreux formats XML, généralement développés dans les entreprises, où les titres des documents étaient placés dans un attribut. Je pense qu'un titre est une partie tellement fondamentale de la communication d'un document qu'il devrait toujours être dans le contenu de l'élément. D'un autre côté, j'ai souvent vu des cas où des identifiants internes de produits étaient jetés en tant qu'éléments dans des fiches descriptives du produit. Dans certains de ces cas, les attributs étaient plus appropriés car le code de produit interne spécifique n'était pas d'un intérêt primordial pour la plupart des lecteurs ou des processeurs du document, en particulier lorsque l'ID était d'un format très long ou impénétrable.
Vous avez peut-être entendu dire que les données principales vont dans les éléments, les métadonnées dans les attributs. Les deux paragraphes ci-dessus expriment vraiment le même principe, mais dans un langage plus délibéré et moins flou.
Principe d'information structurée
Si les informations sont exprimées sous une forme structurée, surtout si la structure peut être extensible, utilisez des éléments. D'un autre côté: si les informations sont exprimées sous forme de jeton atomique, utilisez des attributs. Les éléments sont le moteur extensible pour exprimer la structure en XML. Presque tous les outils de traitement XML sont conçus autour de ce fait, et si vous décomposez correctement les informations structurées en éléments, vous constaterez que vos outils de traitement complètent votre conception et que vous gagnez ainsi en productivité et en maintenabilité. Les attributs sont conçus pour exprimer des propriétés simples des informations représentées dans un élément. Si vous travaillez contre l'architecture de base de XML en partageant des informations structurées avec des chaussures, vous pouvez gagner en complexité et en commodité, mais vous paierez probablement des frais de maintenance.
Les dates sont un bon exemple: une date a une structure fixe et agit généralement comme un seul jeton, donc elle a du sens en tant qu'attribut (de préférence exprimé en ISO-8601). La représentation de noms personnels, d'autre part, est un cas où j'ai vu ce principe surprendre les designers. Je vois beaucoup de noms dans les attributs, mais j'ai toujours soutenu que les noms personnels devraient être dans le contenu des éléments. Un nom personnel a une structure étonnamment variable (dans certaines cultures, vous pouvez provoquer de la confusion ou de l'offense en omettant des titres honorifiques ou en supposant un ordre de parties de noms). Un nom personnel est également rarement un jeton atomique. Par exemple, vous pouvez parfois rechercher ou trier par prénom et parfois par nom de famille. Je dois souligner qu'il est tout aussi problématique de chausse-pied un nom complet dans le contenu d'un élément unique que de le mettre dans un attribut.
L'un des meilleurs éléments réfléchis vs arguments d'attribut provient des K GovTalk guidelines . Cela définit les techniques de modélisation utilisées pour les échanges XML liés au gouvernement, mais il se distingue par ses propres mérites et mérite d'être examiné.
Les schémas DOIVENT être conçus de telle sorte que les éléments soient les principaux détenteurs du contenu de l'information dans les instances XML. Les attributs conviennent mieux à la conservation de métadonnées auxiliaires - des éléments simples fournissant plus d'informations sur le contenu de l'élément. Les attributs NE DOIVENT PAS être utilisés pour qualifier d'autres attributs lorsque cela pourrait provoquer une ambiguïté.
Contrairement aux éléments, les attributs ne peuvent pas contenir de données structurées. Pour cette raison, les éléments sont préférés en tant que principaux détenteurs du contenu de l'information. Cependant, autoriser l'utilisation d'attributs pour contenir des métadonnées sur le contenu d'un élément (par exemple, le format d'une date, une unité de mesure ou l'identification d'un ensemble de valeurs) peut rendre un document d'instance plus simple et plus facile à comprendre.
Une date de naissance peut être représentée dans un message comme:
<DateOfBirth>1975-06-03</DateOfBirth>
Cependant, des informations supplémentaires pourraient être nécessaires, telles que la façon dont cette date de naissance a été vérifiée. Cela pourrait être défini comme un attribut, donnant à l'élément dans un message l'apparence suivante:
<DateOfBirth VerifiedBy="View of Birth Certificate">1975-06-03</DateOfBirth>
Ce qui suit serait inapproprié:
<DateOfBirth VerifiedBy="View of Birth Certificate" ValueSet="ISO 8601" Code="2">1975-06-03</DateOfBirth>
Il n'est pas clair ici si le code qualifie l'attribut VerifiedBy ou ValueSet. Une interprétation plus appropriée serait:
<DateOfBirth>
<VerifiedBy Code="2">View of Birth Certificate</VerifiedBy>
<Value ValueSet="ISO 8601">1975-06-03</Value>
</DateOfBirth>
Personnellement, j'aime utiliser des attributs pour des propriétés simples à valeur unique. Les éléments sont (évidemment) plus adaptés aux types complexes ou aux valeurs répétées.
Pour les propriétés à valeur unique, les attributs conduisent à un XML plus compact et à un adressage plus simple dans la plupart des API.
En règle générale, j'évite complètement les attributs. Oui, les attributs sont plus compacts, mais les éléments sont plus flexibles, et la flexibilité est l'un des avantages les plus importants de l'utilisation d'un format de données comme XML. Ce qui est aujourd'hui une valeur unique peut devenir une liste de valeurs demain.
De plus, si tout est un élément, vous n'avez jamais à vous souvenir de la façon dont vous avez modélisé une information particulière. Ne pas utiliser d'attributs signifie que vous avez une chose de moins à penser.
C'est en grande partie une question de préférence. J'utilise des éléments pour le regroupement et des attributs pour les données lorsque cela est possible car je vois cela comme plus compact que l'alternative.
Par exemple je préfère .....
<?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>
...Au lieu de....
<?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>
Cependant, si j'ai des données qui ne représentent pas facilement à l'intérieur de disons 20-30 caractères ou contiennent de nombreuses citations ou autres caractères qui doivent être échappés, je dirais qu'il est temps de décomposer les éléments ... éventuellement avec des blocs CData.
<?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>
Découvrez Éléments vs attributs par Ned Batchelder.
Belle explication et une bonne liste des avantages et inconvénients des éléments et attributs.
Il se résume à:
Recommandation: utilisez des éléments pour les données qui seront produites ou consommées par une application métier et des attributs pour les métadonnées.
Important: Veuillez voir le commentaire de @ maryisdead ci-dessous pour plus de précisions.
Les limitations des attributs vous indiquent où vous pouvez et ne pouvez pas les utiliser: les noms des attributs doivent être uniques, leur ordre ne peut pas être significatif et le nom et la valeur ne peuvent contenir que du texte. Les éléments, en revanche, peuvent avoir des noms non uniques, avoir un ordre important et avoir un contenu mixte.
Les attributs sont utilisables dans des domaines où ils sont mappés sur des structures de données qui suivent ces règles: les noms et les valeurs des propriétés d'un objet, des colonnes dans une ligne d'une table, des entrées dans un dictionnaire. (Mais pas si les propriétés ne sont pas toutes des types de valeur, ou si les entrées du dictionnaire ne sont pas des chaînes.)
Ma règle d'or personnelle: si un élément ne peut contenir qu'une seule de ces choses, et ses données atomiques (id, nom, âge, type, etc ...), ce devrait être un attribut sinon un élément.
J'ai tendance à utiliser des éléments lorsqu'il s'agit de données qu'un lecteur humain aurait besoin de connaître et d'attributs lorsqu'il ne s'agit que de traitement (par exemple, les ID). Cela signifie que j'utilise rarement des attributs, car la majorité des données sont pertinentes pour le domaine modélisé.
Voici une autre stratégie qui peut aider à distinguer les éléments des attributs: pensez aux objets et gardez à l'esprit MVC.
Les objets peuvent avoir des membres (variables d'objet) et des propriétés (membres avec des setters et des getters). Les propriétés sont très utiles avec la conception MVC, permettant un mécanisme de notification de changement.
Si c'est la direction prise, les attributs seront utilisés pour les données d'application internes qui ne peuvent pas être modifiées par l'utilisateur; les exemples classiques seront ID ou DATE_MODIFIED. Les éléments seront donc utilisés pour des données modifiables par les utilisateurs.
Donc, ce qui suit serait logique compte tenu du fait que le bibliothécaire ajoute d'abord un article de livre (ou un magazine), puis peut modifier son nom d'auteur ISBN, etc.:
<?xml version="1.0" encoding="utf-8"?>
<item id="69" type="book">
<authors count="1">
<author>
<name>John Smith</name>
<author>
</authors>
<ISBN>123456790</ISBN>
</item>