Nous voulons exporter certaines données de notre base de données au format XML. Par exemple, un Person
peut avoir age
, name
et d'autres propriétés.
Nous avons deux choix pour définir le format XML.
Choix n ° 1:
<Persons>
<Person>
<Age>16</Age>
<Name>Richard</Name>
</Person>
<Person>
<Age>34</Age>
<Name>Eric</Name>
</Person>
...
</Persons>
Choix n ° 2:
<Persons>
<Person Age="16" Name="Richard"/>
<Person Age="34" Name="Eric"/>
...
</Persons>
Alors, quelle est la différence entre la définition d'un sous-nœud ou d'un attribut? Et quel est l'avantage de chaque choix?
Réponses:
Il n'y a pas de documentation claire / meilleure pratique pour cela, mais, considérez les alternatives, comme vous l'avez:
En tant que texte d'élément:
<name>
ou<age>
à cette finComme attributs:
age
attributs.J'ai passé beaucoup de temps à travailler avec XML et, à mon avis, pour la communication de données pure, les attributs doivent être utilisés dans la mesure du possible. Si le XML est susceptible d'être utilisé pour la présentation (XSLT, xhtml, etc.), il peut être préférable en tant que contenu texte (mais pas nécessairement).
la source
Principes de conception XML: quand utiliser les éléments par rapport aux attributs par Uche Ogbuji d'IBM est probablement l'une des meilleures ressources en la matière.
Au cœur de la décision est que les attributs sont des choses «faites». Vous ne pouvez pas les changer ou les modifier ou les imbriquer. Ils sont indépendants de l'ordre et distincts dans l'élément (vous ne pouvez pas en avoir deux de la même chose).
Si l'une de ces contraintes est susceptible de changer, faites des données un nœud enfant du XML.
Dans votre exemple, vous avez une personne qui a un nom et un âge. J'ai un prénom, un prénom et un nom ... et un surnom. Et certaines personnes ont des noms de jeune fille, plusieurs prénoms ou des titres honorifiques - comment mettriez-vous John Ronald Reuel Tolkien dans une telle structure?
Et donc nous avons quelqu'un qui a deux prénoms qui ont un ordre pour eux. Cela devrait clairement montrer que non, un attribut n'est pas le meilleur choix pour cela.
Je ne le trouve pas actuellement, mais dans le document lié ci-dessus, il y a une déclaration selon laquelle les noms sont des choses qui nécessitent un peu de réflexion menant à "J'espère développer le traitement des noms de personnes dans le balisage dans un futur article." Si quelqu'un a une piste à ce sujet, veuillez laisser un commentaire ou le modifier à cet endroit.
D'un autre côté, l'âge est quelque chose qui a une structure plutôt fixe (je suggère l'anniversaire plutôt qu'un entier). En tant que tel, la représentation de ces informations dans un format bien connu et compris a du sens dans un attribut. Une personne a un et un seul anniversaire et il n'y a pas de «commande» que vous souhaitez conserver.
Uche Ogbuji identifie trois principes de base pour concevoir correctement un format xml. Les citations suivantes sont abrégées du document lié ci-dessus.
Si l'information est exprimée 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
Si les informations sont destinées à être lues et comprises par une personne, utilisez des éléments. Si les informations sont le plus facilement comprises et digérées par une machine, utilisez des attributs.
Utilisez un élément si vous avez besoin que sa valeur soit modifiée par un autre attribut
Et donc, les noms doivent être des éléments - ce sont des données structurées qui ne sont pas un jeton atomique, elles sont plus susceptibles d'être lues par un humain qu'un ordinateur et elles peuvent être modifiées par un autre attribut sur le nom lui-même.
Les dates doivent être des attributs - ce sont des données qui sont un jeton atomique, elles sont plus susceptibles d'être lues par un ordinateur qu'un humain (puis transformées au format préféré de l'homme si besoin est ), et enfin, il est peu probable qu'elles soient modifiées par d'autres attributs sur eux.
la source
Une autre considération au-delà de celles de Rolfl est le nombre de champs.
Plus qu'un petit nombre d'attributs devient un gâchis et difficile à lire (c'est en supposant que vous voulez que votre xml soit lisible par l'homme, mais en tant que programmeur, vous voudrez le faire pour tester au moins).
De plus, si vous vous attendez à ce que la structure des données de l'un des champs change avec le temps, n'en faites pas un attribut.
Par exemple, votre champ de nom. Peut-être qu'à l'avenir, cela deviendrait
Si vous vous attendez à ce que cela se produise, en faire un attribut signifierait plus de refactoring de code plus tard.
la source
Pour la balise Personnes, il est normal d'avoir plus de balises de Personne, cela a du sens, une liste de Personnes a des entités, pas des attributs.
L'histoire est différente pour Person et ses composants. Une personne ne contient pas de nom, le nom est un attribut de la personne, donc je resterais avec des attributs au lieu de nouvelles balises. Les balises sont utiles lorsque vous avez des choses répétitives comme des adresses, vous ne pouvez pas le faire avec des attributs.
Si nous pensons dans le contexte HTML, vous n'avez pas d'entrée avec une étiquette de nom avec une valeur, n'est-ce pas?
la source