80 votes

Meilleures pratiques XML : attributs ou éléments supplémentaires

Quelle est la différence entre les deux et quand dois-je les utiliser ?

<person>
     <firstname>Joe</firstname>
     <lastname>Plumber</lastname>
</person>

contre

<person firstname="Joe" lastname="Plumber" />

Remerciements

73voto

codemeit Points 9327

Il existe des XML centrés sur les éléments et des XML centrés sur les attributs. Dans votre exemple, le premier est centré sur les éléments, le second sur les attributs. centré sur l'attribut.

La plupart du temps, ces deux modèles sont équivalents, mais il y a quelques exceptions.

Centré sur les attributs

  • Taille plus petite que celle de l'élément centré.
  • Pas très interopérable, car la plupart des analyseurs XML penseront que les données de l'utilisateur sont présentées par l'élément, les attributs étant utilisés pour décrire l'élément.
  • Il n'y a aucun moyen de présenter une valeur nullable pour certains types de données, par exemple nullable int.
  • Ne peut pas exprimer un type complexe.

Centré sur l'élément

  • Le type complexe ne peut être présenté que sous la forme d'un nœud d'élément.
  • Très interopérable
  • Plus grande taille que l'approche centrée sur les attributs. (La compression peut être utilisée pour réduire la taille de manière significative).
  • Les données annulables peuvent être exprimées par l'attribut xsi:nil="true"
  • L'analyse est plus rapide car l'analyseur ne s'intéresse qu'aux éléments contenant des données sur l'utilisateur.

Pratique

Si vous vous souciez vraiment de la taille de votre XML, utilisez un attribut chaque fois que vous le pouvez, s'il est approprié. Utilisez des éléments lorsque vous avez besoin de quelque chose de nullable, d'un type complexe ou pour contenir une grande valeur textuelle. Si vous ne vous souciez pas de la taille du XML ou si la compression est activée pendant le transport, utilisez des éléments car ils sont plus extensibles.

Contexte

Dans DOT NET, XmlSerializer peut sérialiser les propriétés des objets en attributs ou en éléments. Dans le récent cadre WCF, le sérialiseur DataContract ne peut sérialiser que les propriétés dans des éléments et il est plus rapide que XmlSerializer ; la raison en est évidente, il lui suffit de rechercher les données utilisateur dans les éléments lors de la désérialisation.

Voici un article qui l'explique également Élément ou attribut

2 votes

Le XML centré sur les attributs présente un énorme avantage en termes d'interopérabilité avec JSON. Il suffit de quelques indications sur ce qu'il faut mettre dans un tableau et sur ce qu'il faut traiter comme un nombre ou un booléen, et vous pouvez effectuer des conversions automatiques parfaites.

5voto

Greg Hewgill Points 356191

À l'avenir, lorsque vous ajouterez un <address> vous ne voudrez pas en faire un attribut XML. En effet, un attribut <address> peut être un élément plus complexe composé de l'adresse, de la ville, du pays, etc.

C'est pourquoi vous pouvez choisir la première forme de sous-élément, sauf si vous êtes certain que l'attribut n'aura pas besoin d'aller beaucoup plus loin. La première forme permet une plus grande extensibilité à l'avenir.

Si vous êtes un tant soit peu soucieux de l'espace, comprimez votre XML.

0 votes

C'est juste une question de curiosité, mais ne pourrait-on pas avoir un mélange des deux ? Par exemple, le prénom et le nom de famille en tant qu'attributs et l'adresse en tant que nœud. Ce que j'essaie de dire, c'est qu'il n'est pas nécessaire d'en choisir un seul. C'est exact ?

2 votes

Vous avez raison, mais pour des raisons de cohérence lorsque vous représentez les propriétés d'une seule entité ("personne" dans l'exemple original), vous voudrez probablement choisir l'une ou l'autre. De cette façon, vous n'aurez pas à vous rappeler lequel est stocké de quelle façon.

0 votes

<person firstname="Joe" lastname="Plumber"> <address street1="1234 Any Street" postalCode="12345" State="CA" City="Example" /> </person> Je n'arrive pas à trouver le bon format, mais le fait est que vous ne supprimez pas l'extensibilité. Ce ne sont pas les éléments enfants que vous évitez avec le XML centré sur les attributs, mais les nœuds de texte.

4voto

Dans mon entreprise, nous privilégions la deuxième approche.

Nous pensons que "firstname" et "lastname" sont des noms de famille. attributs du nœud "personne", plutôt que sous-domaines du nœud "personne". Il s'agit d'une différence subtile.

À mon avis, la deuxième approche est plus concise et la lisibilité/maintenabilité est nettement améliorée, ce qui est très important.

Bien entendu, cela dépend de votre demande. Je ne pense pas qu'il existe une règle générale qui couvre tous les scénarios.

1 votes

La deuxième approche est plus lisible pour un humain, mais la première approche est plus lisible pour la plupart des analyseurs syntaxiques. La première approche est également plus extensible. Vous devriez lire l'article référencé par @codemeit ( ibm.com/developerworks/xml/library/x-eleatt.html ).

3voto

jschoen Points 5721

Vous pouvez également consulter les réponses aux questions suivantes este que j'ai posée il y a quelque temps. J'ai trouvé les réponses utiles.

2voto

Glomek Points 12183

Les attributs ne sont pas sensibles à l'ordre. Cela peut être un avantage ou un inconvénient en fonction de votre situation.

Les attributs ne peuvent pas être dupliqués. Si "Joe" a deux prénoms, les nœuds sont la seule solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X