XML: élément ou attribut

Céroce

Membre actif
Bonjour à tous,

Comme je suis un peu fainéant et que je ne sais pas trop où chercher, j'invoque vos lumières.
Je souhaite stocker dans un fichier XML le rectangle représentant les coordonnées d'une figure. Plusieurs solutions s'offrent a priori à moi:

Forme 1:
Bloc de code:
<figure x="100" y="150" width="80" height="80"></figure>

Forme 2:
Bloc de code:
<figure>
	<rect x="100" y="150" width="80" height="80"></rect>
</figure>

Forme 3:
Bloc de code:
<figure>
	<rect>
		<x>100</x>
		<y>150</y>
		<width>80</width>
		<height>80</height>
	</rect>
</figure>


Tout cela me laisse perplexe… Fonctionnellement, le résultat sera le même. Il faut aussi comprendre que j'ajouterai par la suite d'autres propriétés à la figure (couleurs, paramètres du tracé, etc.), ce qui me ferait privilégier la forme 3.
Savez-vous quelle est la forme conseillée, ou bien où je peux trouver l'info ?
 
La 1 ne précise pas le type de figure, donc j'éliminerai.
Les 2 et 3 sont similaires, si le nombre d'attributs reste limité je dirai d'utiliser la 2 - c'est d'ailleurs la forme souvent utilisée en HTML et XHTML. Je garderai la 3e forme pour des objets avec une liste d'attributs variable.

PS 1 :
Pour la forme 2:
Bloc de code:
<figure>
	<rect x="100" y="150" width="80" height="80" [B]/>[/B]
</figure>

PS 2 : pour du graphisme en XML, utilise la norme SVG, c'est fait pour :rateau:
 
Merci de ta réponse !

Pour la forme 2:
Bloc de code:
<figure>
	<rect x="100" y="150" width="80" height="80" [B]/>[/B]
</figure>

Non, c'est interdit, on se le permet en XHTML, mais la norme XML impose de mettre systématiquement la balise de fermeture (pour faciliter la conception de parsers, qu'y disent).

Le SVG ne correspond pas à mes besoins (les figures ne sont qu'un aspect), mais je vais quand même aller voir comment c'est fichu pour m'inspirer.
 
Non, c'est interdit, on se le permet en XHTML, mais la norme XML impose de mettre systématiquement la balise de fermeture (pour faciliter la conception de parsers, qu'y disent).

Non la forme donnée par ntx est correcte car il y le /> à la fin. D'ailleurs le xhtml est du html traité comme du xml (avec le bon header http). Ce genre de balise autofermante existe aussi en svg et dans plein d'autres syntaxes xml.

P.S. : Si ça peut t'aider et si c'est pour faire des graphismes vectoriels (en svg), il y a une librairie en php qui fait ça.
 
Bloc de code:
<shape>
    <rect frame="100.0,150.0,80.0,80.0" [B]/>[/B]
</shape>

<shape type="rect" frame="100.0,150.0,80.0,80.0" [B]/[/B]>

En fait, cela est plus difficile à faire. J'utilise le parser Cocoa d'Apple (NSXML). Il me renvoie les attributs sous forme d'une chaîne, que je convertis ensuite par un simple [attributeString floatValue]. Pour ce que tu proposes, il faudrait que je décompose la chaîne (toujours chiant à faire en ObjC). Toutefois cela répond un peu à ma question de départ: pourquoi utilise-t-on les attributs plutôt qu'imbriquer d'autres éléments.
 
En fait, cela est plus difficile à faire. J'utilise le parser Cocoa d'Apple (NSXML). Il me renvoie les attributs sous forme d'une chaîne, que je convertis ensuite par un simple [attributeString floatValue]. Pour ce que tu proposes, il faudrait que je décompose la chaîne (toujours chiant à faire en ObjC). Toutefois cela répond un peu à ma question de départ: pourquoi utilise-t-on les attributs plutôt qu'imbriquer d'autres éléments.
:D
Bloc de code:
[COLOR=Purple]NSArray[/COLOR] *frame = [param [COLOR=Blue]componentsSeparatedByString[/COLOR]:[COLOR=Red]@","[/COLOR]];
[COLOR=Purple]CGFloat[/COLOR] x = [[frame [COLOR=Blue]objectAtIndex[/COLOR]:[COLOR=DarkOrange]0[/COLOR]] [COLOR=Blue]floatValue[/COLOR]];
[COLOR=Purple]CGFloat[/COLOR] y = [[frame [COLOR=Blue]objectAtIndex[/COLOR]:[COLOR=DarkOrange]1[/COLOR]] [COLOR=Blue]floatValue[/COLOR]];
[COLOR=Purple]CGFloat[/COLOR] width = [[frame [COLOR=Blue]objectAtIndex[/COLOR]:[COLOR=DarkOrange]2[/COLOR]] [COLOR=Blue]floatValue[/COLOR]];
[COLOR=Purple]CGFloat[/COLOR] height = [[frame [COLOR=Blue]objectAtIndex[/COLOR]:[COLOR=DarkOrange]3[/COLOR]] [COLOR=Blue]floatValue[/COLOR]];

[COLOR=Purple]CGRect[/COLOR] rect = [COLOR=Blue]CGRectMake[/COLOR](x, y, width, height);
:siffle::rateau::p feignasse :D

pour le pourquoi je pense qu il ya different usage pour different problem
mais tu devrais utiliser un modele SVG il y a une DTD et tout et tout

http://developer.apple.com/document...ts.html#//apple_ref/doc/uid/20002265-BCIJFGJI

http://developer.apple.com/document...L_Concepts/Articles/AttributesNamespaces.html
 

Ouais carrément ! :D

Pour en revenir au SVG, je ne veux pas utiliser ce format, car les formes vectorielles sont secondaires dans mon programme. Si c'était un logiciel de dessin vectoriel, utiliser le SVG serait approprié. Mais ça se rapproche plus de ce que Pages propose: placer des formes prédéterminées (rectangle, ellipse, polygone régulier…) sur une page. Je n'ai pas besoin d'enregistrer les coordonnées des courbes de Bézier, juste le type de figure, ses dimensions et son orientation.