[XML] Attribut ou élément ? Qu'est ce qui est le plus logique ?

Attribut ou élément ? Qu'est ce qui est le plus logique ? [XML] - XML/XSL - Programmation

Marsh Posté le 02-09-2004 à 16:26:38    

Bonjour,
 
Voilà je débute dans le XML. Je vais me servir d'un fichier XML pour stocker différents paramètres d'un logiciel. J'ai commencé à faire mon fichier au brouillon :
 

Code :
  1. <Parametres>
  2.   <Communication>
  3.     <port>COM1</port>
  4.     <debit>9600</debit>
  5.     <bits_donnees>8</bits_donnees>
  6.     <bits_stop>1</bits_stop>
  7.     <parite></parite>
  8.   </Communication>
  9. </Parametres>


 
(bon il y a d'autres données mais c'est cette partie qui m'intéresse).
En relisant mon brouillon je me suis dis qu'il y avait quelque chose qui clochait. "debit", "bits_donnees", "bits_stop", "parite" n'ont pas la même importance hiérarchique que "port". Après réflexion je suis arrivé à deux résultats :
 

Code :
  1. <Parametres>
  2.   <Communication>
  3.     <port>
  4.       <nom_port>COM1</nom_port>
  5.       <debit>9600</debit>
  6.       <bits_donnees>8</bits_donnees>
  7.       <bits_stop>1</bits_stop>
  8.       <parite></parite>
  9.     </port>
  10.   </Communication>
  11. </Parametres>


 
et
 

Code :
  1. <Parametres>
  2.   <Communication>
  3.     <port debit="9600" bits_donnees="8" bits_stop="1" parite="">COM1</port>
  4.   </Communication>
  5. </Parametres>


 
bref, je reste perplexe et n'arrive pas à me décider sur ce qui est le plus logique. Bon j'avoue, j'ai l'impression de me prendre un peu la tête pour pas grand chose, sachant que comme je l'ai dit mon fichier sert uniquement pour stocker des paramètres d'un logiciel et n'a donc pas besoin d'être valide mais uniquement bien formé. Mais comme je débute j'aimerai acquérir dès maintenant la bonne démarche d'esprit.
Merci d'avance pour vos réponses :jap:


---------------
"I'm as mad as hell and I'm not going to take this anymore !"
Reply

Marsh Posté le 02-09-2004 à 16:26:38   

Reply

Marsh Posté le 02-09-2004 à 16:27:54    

c'est completement arbitraire, mais je préfere le 3.
sauf que je mettrais aussi le nom en attribut

Reply

Marsh Posté le 02-09-2004 à 16:39:24    

je viens de lire ca sur le site de MSDN :

Citation :


Dois-je utiliser un élément ou un attribut ?
 
Les éléments sont utilisés pour encapsuler des sous-ensembles de données, tandis que les attributs sont généralement employés pour fournir des informations complémentaires sur un élément et non pour contenir des données brutes. Vous opterez pour l'utilisation d'un élément ou d'un attribut en tenant compte des besoins de votre application.
 
Utilisez des attributs si des données de type simple sont requises et :
 
    * que vos informations requièrent une valeur fixe ou par défaut ;
    * que vos informations requièrent des métadonnées d'un élément existant ;
    * que la taille de votre fichier XML constitue un facteur critique ; les attributs ont en effet généralement tendance à occuper quelques octets de moins que les éléments.
 
La liste suivante répertorie les principales différences entre éléments et attributs du point de vue du schéma :
 
    * Un schéma peut définir si l'ordre des éléments est significatif, mais les attributs peuvent se présenter dans n'importe quel ordre.
    * Les éléments peuvent être imbriqués à l'aide de la balise <choice>, ce qui signifie qu'un seul des éléments répertoriés peut s'afficher.
    * Les éléments peuvent apparaître plusieurs fois, ce qui n'est pas le cas des attributs.


donc si j'ai bien tout compris, la solution la "meilleure" dans mon cas serait l'utilisation d'attributs comme tu le suggérais lorill.


Message édité par BaCkFiRe le 02-09-2004 à 16:40:07

---------------
"I'm as mad as hell and I'm not going to take this anymore !"
Reply

Marsh Posté le 05-09-2004 à 15:28:57    

Je vote aussi pour la solution 3, plus compacte et au final plus lisible, tu t'en rendras vite compte avec un gros document. De plus, la solution 3 peut t'éviter des erreurs car les attributs sont plus limités que les éléments.

Reply

Marsh Posté le 07-11-2007 à 00:13:37    

busOman a écrit :

Je vote aussi pour la solution 3, plus compacte et au final plus lisible, tu t'en rendras vite compte avec un gros document. De plus, la solution 3 peut t'éviter des erreurs car les attributs sont plus limités que les éléments.


 
Les structures proposées par BaCkFiRe peuvent être interprétées de deux façons totalement différentes :
 
1) Si les informations servent à configurer une "communication" en disant quel port elle doit utiliser, quel débit, quelle parité, etc... Alors la première solution me semble la meilleure.
 
2) Par contre, si les informations servent à décrire la configuration du port COM1, alors la première solution ne fonctionne pas du tout et les 2 autres ne sont pas satisfaisantes non plus. Dans ce cas, la 3e solution est même la plus mauvaise ! Pour moi, la meilleure solution serait exactement l'inverse de la 3e de BaCkFiRe, c'est a dire :
 

Code :
  1. <Parametres>
  2.   <Communication>
  3.     <port nom="COM1">
  4.       <debit>9600</debit>
  5.       <bits_donnees>8</bits_donnees>
  6.       <bits_stop>1</bits_stop>
  7.       <parite/>
  8.     </port>
  9.   </Communication>
  10. </Parametres>


 
A mon avis, il faut essayer de mettre en attributs les informations orientées "identification" ou "critères de sélection" et laisser le "contenu" dans les éléments. Tout simplement parce que certains outils XML, comme le langage XPath utilisé par exemple dans XSLT, proposent des syntaxes simplifiées pour accéder à des données XML quand on les filtre selon leurs attributs.
 
Par exemple, en XPath, pour accéder au débit du port COM1:
 
- En utilisant la structure que j'ai décrite, il suffit d'écrire :
 

Code :
  1. port[@nom="COM1"]/debit


 
- Alors que si on utilise la solution 3 de BaCkFiRe, il faut écrire :
 

Code :
  1. port[child::text()="COM1"]/attribute::debit


 
qui peut effectivement être simplifiée en :
 

Code :
  1. port[text()="COM1"]/@debit


 
mais qui reste quand même moins lisible et plus lourde que la première expression...
 
 
Donc, pour pouvoir répondre à BaCkFiRe, il faudrait d'abord savoir si son fichier sert à paramétrer une communication ou à paramétrer un port. C'est à dire si COM1 est une donnée de la "communication" à paramétrer ou si COM1 est l'indentifiant du "port" à paramétrer...

Message cité 1 fois
Message édité par Addwyn le 07-11-2007 à 12:21:01
Reply

Marsh Posté le 07-11-2007 à 09:05:12    

Je préfère la 3, avec le nom en attribut aussi :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-11-2007 à 11:54:58    

masklinn a écrit :

Je préfère la 3, avec le nom en attribut aussi :o


 
Si le but du fichier XML est de configurer une communication, on peut même aller plus loin que la solution 3 de BaCkFiRe et mettre directement :
 

Code :
  1. <Parametres>
  2.   <Communication port="COM1" debit="9600" bits_donnees="8" bits_stop="1" parite=""/>
  3. </Parametres>



Message édité par Addwyn le 07-11-2007 à 12:22:28
Reply

Marsh Posté le 07-11-2007 à 12:24:55    

debit, etc. dépends de la valeur de port ou pas ?
 
je veux dire, t'as COM1... mais si demain d'as LPT1 ou USB, est-ce que tu auras les mêmes attributs ?
 
si oui, alor sla dernière structure proposée par addwyn me plait bien.
si non, perso, je ferais :
 

Code :
  1. <Parametres>
  2.  <Communication port="COM1">
  3.    <COM1Settings debit="9600" bits_donnees="8" bits_stop="1" parite=""/>
  4.  </Communication>
  5.  <Communication port="USB">
  6.    <USBSettings version="2.0" power_saving="false"/>
  7.  </Communication>
  8. </Parametres>


 
Et même en variante :

Code :
  1. <Parametres>
  2.  <Communication>
  3.    <COM1 debit="9600" bits_donnees="8" bits_stop="1" parite=""/>
  4.    <USB version="2.0" power_saving="false"/>
  5.  </Communication>
  6. </Parametres>


=> L'intérêt de la seconde solution c'est que tu peux aisément effectuer un contrôle en XSD ou DTD ou cequetuveuxquivabien
=> Vu que le type de port est énumérable, et sujet à peu de changements, je pense acceptable de déporter la donnée "port" au niveau de la structure, puisqu'elle est énumérable.


Message édité par MagicBuzz le 07-11-2007 à 12:30:37
Reply

Marsh Posté le 08-11-2007 à 07:39:10    

Wahou, alors là je pensais pas avoir des réponses aussi intéressantes plus de 3 ans après ma demande :eek: :D
 

Addwyn a écrit :


Donc, pour pouvoir répondre à BaCkFiRe, il faudrait d'abord savoir si son fichier sert à paramétrer une communication ou à paramétrer un port. C'est à dire si COM1 est une donnée de la "communication" à paramétrer ou si COM1 est l'indentifiant du "port" à paramétrer...


J'ai un peu de mal à voir la différence donc tu vas dire si je me trompe : dans le 1er cas le port série est un moyen de communication comme un autre et cela pourrait être, comme le disait MagicBuzz, LPT1 ou USB ou une adresse IP,... chacun ayant des attributs différents. Et dans le 2ème cas, on communique forcément par série (et on a donc toujours les mêmes attributs) et on décrit les paramètres du port. J'ai bon ?
 
En tout cas merci addwyn pour cette réponse détaillée :jap:


---------------
"I'm as mad as hell and I'm not going to take this anymore !"
Reply

Marsh Posté le 08-11-2007 à 13:03:00    

BaCkFiRe a écrit :


dans le 1er cas le port série est un moyen de communication comme un autre et cela pourrait être, comme le disait MagicBuzz, LPT1 ou USB ou une adresse IP,... chacun ayant des attributs différents. Et dans le 2ème cas, on communique forcément par série (et on a donc toujours les mêmes attributs) et on décrit les paramètres du port.


 
Oui, c'est bien ça. Pour préciser un peu ce que je voulais dire, je me place du point de vue de l'application. Pour elle, le fichier de paramêtre est là pour répondre à certaines questions:
 
Si l'application demande "Je dois établir une communication. De quelle façon dois-je communiquer ?", alors le fichier XML est là pour donner tous les paramètres de la communication y compris le port. C'était mon cas N°1.
 
Si l'application demande: "J'ai besoin de configurer mon port COM1. Quels paramètres dois-je lui appliquer ?", alors le fichier XML est là pour donner les caractéristiques du port COM1. Dans ce cas, "COM1" est la clé de recherche des informations et non une "donnée". C'était mon cas N°2.
 
Pour le contrôle XSD ou DTD, les idées de MagicBuzz sont très intéressantes. Je retirerais juste le chiffre 1 du nom de l'élément COM puisqu'on peut éventuellement avoir COM1, COM2, etc...
 

Code :
  1. <Parametres>
  2.   <Communication>
  3.     <COM device="com1" debit="9600" bits_donnees="8" bits_stop="1" parite=""/>
  4.     <COM device="com2" debit="19200" bits_donnees="8" bits_stop="1" parite="paire"/>
  5.     <USB version="2.0" power_saving="false"/>
  6.   </Communication>
  7. </Parametres>


 
Par contre, si on condidère que les paramêtres d'une communication série peuvent être indépendants du port série utilisé, alors la 1ere variante proposée par MagicBuzz me parait excellente, avec peut-être quelques petites modifs :
 

Code :
  1. <Parametres>
  2.   <Communication type="serie" device="com1">
  3.     <COM debit="9600" bits_donnees="8" bits_stop="1" parite=""/>
  4.   </Communication>
  5. </Parametres>



Message édité par Addwyn le 08-11-2007 à 13:25:01
Reply

Marsh Posté le 08-11-2007 à 13:03:00   

Reply

Marsh Posté le 08-11-2007 à 21:35:04    

encore une fois, réponse très intéressante :jap: Je garde toutes ces informations au chaud car j'aurai l'occasion prochainement de remettre les mains dans du XML :)


---------------
"I'm as mad as hell and I'm not going to take this anymore !"
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed