Attribut XML vs élément XML
Au travail, on nous demande de créer des fichiers XML pour transmettre des données à un autre en mode hors connexion de l'application qui va ensuite créer un deuxième fichier XML à transmettre dans le but de mettre à jour certaines de nos données. Au cours de ce processus, nous avons discuté avec l'équipe de l'application sur la structure du fichier XML.
L'exemple, je suis venu avec est essentiellement quelque chose comme:
<INVENTORY>
<ITEM serialNumber="something" location="something" barcode="something">
<TYPE modelNumber="something" vendor="something"/>
</ITEM>
</INVENTORY>
L'autre équipe a dit que ce n'était pas la norme de l'industrie et des attributs doit être utilisé uniquement pour les méta-données. Ils ont suggéré:
<INVENTORY>
<ITEM>
<SERIALNUMBER>something</SERIALNUMBER>
<LOCATION>something</LOCATION>
<BARCODE>something</BARCODE>
<TYPE>
<MODELNUMBER>something</MODELNUMBER>
<VENDOR>something</VENDOR>
</TYPE>
</ITEM>
</INVENTORY>
La raison je suggère le premier est que la taille du fichier créé est beaucoup plus petite. Il y aura environ 80000 éléments qui seront dans le fichier en cours de transfert. Leur suggestion dans la réalité s'avère trois fois plus grand que celui que j'ai proposé. J'ai cherché le mystérieux "Standard de l'Industrie" qui a été mentionné, mais le plus proche que j'ai pu trouver est que les attributs XML doit être utilisé uniquement pour les méta-données, mais a déclaré que le débat sur ce qui a été meta-données.
Après de longue haleine explications (désolé) comment voulez-vous déterminer ce qui est méta-données, et lors de la conception de la structure d'un document XML, comment devriez-vous décider quand utiliser un attribut ou un élément?
- J'ai trouvé ce vraiment une bonne ressource: ibm.com/developerworks/xml/library/x-eleatt.html
- +1 pour le "...le débat est sur le ce a été fait de meta-données."
- Veuillez noter minuscules des noms de balise avec des traits d'union : stackoverflow.com/questions/1074447/...
Vous devez vous connecter pour publier un commentaire.
- Je utiliser cette règle de base:
Si le vôtre est à proximité. J'aurais fait quelque chose comme:
MODIFIER: mise à Jour de l'exemple d'origine sur la base des commentaires ci-dessous.
<
est<
, qui est une référence de caractère, pas une entité de référence.<
est OK dans les attributs. Voir: w3.org/TR/REC-xml/#sec-predefined-ent]]>
!)Certains des problèmes avec les attributs sont:
Si vous utilisez les attributs comme des conteneurs de données, vous vous retrouvez avec des documents qui sont difficiles à lire et à maintenir. Essayez d'utiliser ces éléments pour décrire les données. Utiliser des attributs uniquement à fournir des renseignements qui ne sont pas pertinents pour les données.
Ne pas finir comme ceci (ce n'est pas comment XML devrait être utilisé):
Source: http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp
list
est une solution partielle à ce problème. Il ne peut y avoir plusieurs attributs avec le même nom. Aveclist
attribut n'a toujours qu'une seule valeur, qui est un espace séparé liste de certains types de données. La séparation des caractères sont fixés de sorte que vous ne peut pas avoir plusieurs valeurs si une seule valeur de l'voulait type de données peut contenir d'espaces. Ceci exclut de fait les chances d'avoir par exemple plusieurs adresses dans un attribut "address"."XML" est synonyme de "eXtensible Balisage de la Langue". Un langage de balisage implique que les données de texte, marqué avec des métadonnées sur la structure ou la mise en forme.
XHTML est un exemple de XML utilisées de la façon dont il a été conçu:
Ici, la distinction entre les éléments et attributs est clair. Les éléments de texte sont affichés dans le navigateur, et les attributs sont des instructions sur la comment pour les afficher (bien qu'il existe quelques balises qui ne fonctionnent pas de cette façon).
Confusion survient lorsque XML est utilisé non pas comme un langage de balisage, mais comme un de sérialisation de données langue, dans laquelle la distinction entre les "données" et les "métadonnées" est plus vague. Donc, le choix entre les éléments et attributs est plus ou moins arbitraire, sauf pour les choses qui ne peut pas être représenté avec les attributs (voir feenster de réponse).
Élément XML vs Attribut XML
XML est tout au sujet de l'accord. Premier reporter à aucun des schémas XML ou les conventions établies au sein de votre communauté ou de l'industrie.
Si vous êtes vraiment dans une situation à définir votre schéma à partir de la base, voici quelques considérations générales qui doivent informer le élément vs attribut de décision:
Cela peut dépendre de votre utilisation. XML qui est utilisé pour représenter stuctured de données générées à partir d'une base de données peut bien travailler avec, finalement, les valeurs de champ d'être placé en tant qu'attributs.
Cependant XML utilisé comme transport de message serait souvent mieux à l'aide de plusieurs éléments.
Par exemple permet de dire que nous avons eu ce XML tel que proposé dans la réponse:-
Maintenant nous envoyer l'ÉLÉMENT de l'élément à un appareil pour imprimer il de codes à barres cependant, il ya un choix de types de codage. Comment pouvons-nous représenter le type de codage requis? Soudain, nous nous rendons compte, un peu tardivement, que le code-barres n'était pas un seul automic valeur, mais plutôt qu'il peut être qualifié avec le codage requis lors de l'impression.
Le point est, à moins que vous construisez une sorte de XSD ou DTD avec un espace de noms pour fixer la structure en pierre, vous pourriez être mieux servis laisser vos options ouvertes.
OMI XML est à son niveau le plus utile lorsqu'il peut être plié sans casser le code existant de l'utiliser.
- Je utiliser les lignes directrices suivantes dans mon schéma de conception en ce qui concerne les attributs vs éléments:
normalizedString types)
eventStartDate et eventEndDate) pour un élément. Dans l'exemple précédent,
il devrait y avoir un élément nouveau pour la "événement" qui peut contenir la date de début et
date de fin attributs.
éléments.
les attributs.
La préférence pour les attributs est il fournit les éléments suivants:
J'ai ajouté lorsque cela est techniquement possible car il y a des moments où l'utilisation d'attributs ne sont pas possibles. Par exemple, l'attribut choix. Par exemple, utiliser (startDate et endDate) xor (startTS et endTS) n'est pas possible avec le langage de schéma
Si le Schéma XML commence d'autoriser "toutes les" le modèle de contenu pour être restreinte ou élargie, alors je serais probablement tomber
Il n'y a pas de réponse universelle à cette question (j'ai été fortement impliqué dans la création du W3C spec). XML peut être utilisé à plusieurs fins - texte-comme les documents, les données et les code sont trois des plus communs. J'ai aussi beaucoup l'utiliser comme un modèle de données. Il y a des aspects de ces applications où les attributs sont plus fréquentes, et d'autres où les éléments enfants sont plus naturels. Il y a également les caractéristiques des différents outils qui rendent plus facile ou plus difficile à utiliser.
XHTML est un domaine où les attributs ont une utilisation naturelle (par exemple, dans la classe='foo'). Les attributs ne sont pas d'ordre et cela peut rendre plus facile pour certaines personnes de développer des outils. Otoh, que les attributs sont plus difficiles à taper sans un schéma. J'ai aussi trouver des espaces d'attributs (foo:bar="zork") sont souvent plus difficiles à gérer dans divers ensembles d'outils. Mais jetez un oeil à certains de la W3C langues de voir le mélange qui est commun. SVG, XSLT, XSD, MathML sont des exemples bien connus de langues et tous ont un riche apport des attributs et des éléments. Certains langages permettent même aux plus-que-un-moyen de le faire, par exemple,
ou
Noter que ce ne sont PAS équivalentes du point de vue syntaxique et nécessitent un soutien explicite dans les outils de traitement)
Mon conseil serait d'avoir un coup d'oeil à la pratique courante dans la zone la plus proche de votre application et d'examiner ce que l'ensemble des outils que vous pouvez faire.
Enfin, assurez-vous que vous différencier des espaces de noms d'attributs. XML systèmes (par exemple, Linq) représentent des espaces de noms en tant qu'attributs dans l'API. IMO c'est laid et potentiellement source de confusion.
En cas de doute, KISS -- pourquoi mélanger les attributs et les éléments lorsque vous n'avez pas de raison d'utiliser des attributs. Si vous décidez par la suite de définir un XSD, qui finira par être plus propre ainsi. Alors même si vous décidez par la suite de générer une structure de classe de votre XSD, qui sera plus simple ainsi.
la question à un million!
tout d'abord, ne vous inquiétez pas trop à propos de la performance, maintenant. vous serez étonné de voir comment rapidement un optimisée analyseur xml rip par le biais de votre xml. plus important encore, quelle est votre conception de l'avenir: comme le XML évolue, comment allez-vous maintenir le couplage et l'interopérabilité?
plus concrètement, vous pouvez faire le modèle de contenu d'un élément plus complexe, mais il est plus difficile de prolonger d'un attribut.
Utiliser des éléments de données et les attributs de méta-données (données sur l'élément de données).
Si un élément est un prédicat dans vos sélectionner des chaînes, vous avez un bon signe que ça doit être un attribut. De même, si un attribut n'est jamais utilisé comme un prédicat, alors peut-être il n'est pas utile de meta-données.
Rappelez-vous que XML est censé être lisible à la machine de ne pas lisibles par l'homme et pour les grands documents XML compresse très bien.
D'autres, ont assuré comment faire la différence entre les attributs d'éléments, mais à partir d'un point de vue plus général de tout mettre en attributs, car il rend le XML résultant petit, c'est mal.
XML n'est pas conçu pour être compact, mais pour être portable et lisible par l'homme. Si vous voulez réduire la taille des données en transit ensuite utiliser quelque chose d'autre (comme google protocol buffers).
Il est défendable, mais vos collègues sont en droit, dans le sens que le XML doit être utilisé pour le "balisage" ou les méta-données sur les données réelles. Pour votre part, vous avez raison en ce qu'il est parfois difficile de décider de l'endroit où la ligne entre les méta-données et les données lors de la modélisation de votre domaine en XML. Dans la pratique, ce que je fais est de prétendre que rien dans le balisage est caché, et seules les données à l'extérieur de la majoration est lisible. Le document se faire un certain sens de cette façon?
XML est notoirement volumineux. Pour le transport et le stockage, la compression est fortement recommandé si vous pouvez vous permettre la puissance de traitement. XML compresse bien, parfois incroyablement bien, à cause de sa répétitivité. J'ai eu de gros fichiers compresser à moins de 5% de leur taille d'origine.
Un autre point pour renforcer votre position est que tandis que l'autre équipe est de se disputer sur le style (dans la plupart des outils XML va gérer un attribut document tout aussi facilement comme un tout-#PCDATA document) vous faisant valoir les aspects pratiques. Alors que le style ne peut pas être totalement ignorée, les mérites techniques devraient avoir plus de poids.
Les deux méthodes pour stocker les propriétés de l'objet sont parfaitement valides. Vous devriez partent de considérations pragmatiques. Essayez de répondre aux questions suivantes:
Ne lisibilité de la matière?
...
C'est en grande partie une question de préférence. J'ai utiliser les Éléments du regroupement et des attributs de données si possible que j'y vois plus compact que les autres.
Par exemple je préfère.....
...Au lieu de.....
Cependant, si j'ai des données qui ne représentent pas facilement à l'intérieur de dire de 20 à 30 caractères ou contient de nombreuses citations ou d'autres caractères qui ont besoin d'échapper alors je dirais qu'il est temps de sortir les éléments... peut-être avec CData blocs.
Façon à tirer avantage de notre dur gagné de l'orientation de l'objet de l'intuition? J'ai l'habitude de trouver, il est simple de penser qui est un objet, et qui est un attribut de l'objet ou de l'objet dont il est fait référence.
Selon intuitivement le sens comme objets doivent s'inscrire en tant qu'éléments. Ses attributs (ou propriétés) seraient les attributs de ces éléments xml ou de l'enfant de l'élément avec l'attribut.
Je pense que pour les cas les plus simples, comme dans l'exemple de l'orientation de l'objet analogie œuvres d'accord pour savoir qui est l'élément et qui est l'attribut d'un élément.
Juste un couple des corrections à certaines mauvaises info:
@John Ballinger: Attributies peut contenir n'importe quel caractère de données. < > & "' doivent être échappés à < > & " et ' , respectivement. Si vous utilisez une bibliothèque XML, il prendra soin de cela pour vous.
L'enfer, un attribut peut contenir des données binaires comme une image, si vous voulez vraiment, juste en base64 de codage et de le rendre de données: URL.
@feenster: Attributs peuvent contenir séparées par un espace de plusieurs éléments dans le cas de l'IDS ou les NOMS, qui pourrait inclure des numéros. Pinailleurs, mais cela peut finir par économiser de l'espace.
À l'aide d'attributs peut garder XML concurrentiel avec JSON. Voir La graisse de Balisage: ajustement de la Graisse de Balisage Mythe des calories à un moment.
Je suis toujours surpris par les résultats de ces sortes de discussions. Pour moi il y a une règle très simple pour décider si les données appartient à un attribut ou comme contenu et qui est de savoir si les données ont navigables de la sous-structure.
Ainsi, par exemple, de la non-majoration de texte appartient toujours dans les attributs. Toujours.
Listes appartiennent à la sous-structure ou de contenu. Texte qui pourrait, au fil du temps, inclure intégré structuré sous-contenu appartiennent dans le contenu. (Dans mon expérience, il y a relativement peu de ce texte avec des balises - lors de l'utilisation de XML pour le stockage de données ou d'échange.)
Schéma XML écrit de cette manière concise.
Chaque fois que je vois des cas comme
<car><make>Ford</make><color>Red</color></car>
, je pense à moi-même "gee a fait l'auteur pense qu'il n'y allaient être sous-éléments au sein de le faire élément?"<car make="Ford" color="Red" />
est nettement plus lisible, il n'y a aucune question à propos de la façon dont les espaces sont manipulés, etc.Donné juste, mais la gestion des espaces blancs règles, je crois que c'était l'intention claire de l'XML concepteurs.
C'est très clair dans le code HTML où les différences d'attributs et de balisage peut être clairement vu:
Si vous avez juste pur des données en XML, il est moins nette différence. Les données pourraient se tenir entre le balisage ou en tant qu'attributs.
=> la Plupart des données devrait se tenir entre le balisage.
Si vous souhaitez utiliser les attributs ici: Vous pourriez diviser les données en deux catégories: les Données et les "méta-données", où les méta-données ne fait pas partie de l'enregistrement, vous voulez présenter, mais des choses comme "format", "date de création", etc.
On pourrait aussi dire: "Utiliser des attributs pour caractériser la balise, d'utiliser des tags pour fournir des données lui-même."
Je suis d'accord avec feenster. Restez à l'écart à partir d'attributs si vous le pouvez. Les éléments sont des évolutions convivial et plus interopérables entre services web boîtes à outils. Vous n'auriez jamais trouver ces boîtes à outils de la sérialisation de vos messages de requête/réponse à l'aide d'attributs. Cela fait sens, parce que nos messages sont données (pas de métadonnées) pour un service web toolkit.
Attributs peuvent facilement devenir difficile à gérer dans le temps de me faire confiance. j'ai toujours rester loin d'eux personnellement. Les éléments sont beaucoup plus explicite et lisible et utilisable par les deux analyseurs et les utilisateurs.
Seule fois où je l'ai jamais utilisé a été de définir l'extension de fichier d'un actif url:
je suppose que si vous savez à 100% de l'attribut sera pas besoin d'être développé vous pourriez utiliser, mais combien de temps savez-vous que.