bonjour
j’ai un fichier XMLde ce format :
<System NAME="aircraft">
<Model ID="apache">
<Model3D>AAAA</Model3D>
<ConfigurationFile>BBBB</ConfigurationFile>
</Model>
<DefaultModel>
<Model3D>AAAA</Model3D>
<ConfigurationFile>BBBB</ConfigurationFile>
</DefaultModel>
</System>
<System NAME="BOAT">
<Model ID="Ferry">
<Model3D>CCCC</Model3D>
<ConfigurationFile>DDDD</ConfigurationFile>
</Model>
<DefaultModel>
<Model3D>CCCC</Model3D>
<ConfigurationFile>DDDD</ConfigurationFile>
</DefaultModel>
</System>
<DefaultSystem>
<DefaultModel>
<Model3D>AAAA</Model3D>
<ConfigurationFile>BBB</ConfigurationFile>
</DefaultModel>
</DefaultSystem>
j’ai fais un programme en c++ qui li ce fichier xml et qui retourne le contenu de ces deux balises : * Model3D et ConfigurationFile, on lui passant ces deux paramétrés:
le NAME du system et le ID du model.
pour le moment ça marche.
voici l’algorithme:
entrer NAME et ID;
si NAME existe
si ID existe
retourne Model3D et ConfigurationFile
sinon
retourne DefaultModel
sinon
retourne DefaultSystem.
mais comme vous remarquez, il y a des répétitions
exemple:
dans
le et et contiennent les mêmes valeurs.
Question:
Est ce que il n’y a pas une méthode pour éviter cette répétition?
par exemple:
AAAA
BBBB
....
ça tient plus du forum prgrammation ton histoire là 
Mais je serais tenté de dire qe les valeurs “defauts” sont nécessaires et qu’elles ont leur place au même titre que les autres, quand bien même les valeurs contenues soient les mêmes.
La valeur défaut est là pour éviter que le programme se bloque au cas où il ne trouve pas l’entrée q’il est censé chercher. S’il ne trouve pas (pour une raison X ou Y) il prend la valeur Défaut et ainsi on évite un blocage.
Edité le 21/05/2009 à 09:14
Heu… Sur ton simple exemple, je comprends pas ce que tu veux faire (si le parsing ne retourne rien). En fait pourquoi retourne-tu un modèle par défaut et qu’est ce qui définit ce modèle par défaut ? Ta répétition est elle juste un hasard ou le modèle par défaut référence-il un modèle existant ? Dans ce cas, ne dois tu pas avoir une structure XML type
<System NAME="aircraft" default="apache">
<Model ID="apache">
<Model3D>AAAA</Model3D>
<ConfigurationFile>BBBB</ConfigurationFile>
</Model>
<Model ID="hind">
<Model3D>CCCP</Model3D>
<ConfigurationFile>DDDD</ConfigurationFile>
</DefaultModel>
</System>
Edité le 21/05/2009 à 11:39
mais regardez:
chaque SYSTEM contient plusieurs MODELs et un DEFAULTMODEL. ce dernier est surement l’un des MODELs de même SYSTEM.
si le ID passé en paramètre n’existe pas dans le SYSTEM je dois retourner le DEFAULTMODEL. de ce SYSTEM.
je reformule ma question:
puisque le DEFAULTMODEL de chaque SYSTEM est l’un de ses MODELs, est ce que il n’y a pas une méthode pour lier la balise DEFAULTMODEL à une balise MODEL sans réécrire son contenu encore une fois???
Tu n’as pas des librairies pour faire ce que tu veux simplement? Parce qu’en une (ou deux) requête Xpath, tu récupères ce que tu veux là (genre System[@NAME=‘aircraft’ and @default=‘apache’] pour toutes les balises System ayant aircraft et apache).
Non parceque tu mélange deux notions : d’un coté ton XML est un conteneur de données. Tes données sont organisées en fonction du modèle que tu a défini. Dans ton cas, il n’agit d’une série de systèmes contenant des modèles. De l’autre coté, tu a une notion de modèle (et système) par défaut qui n’est pas une notion de données mais applicative : il s’agit de référencer les données à récupérer dans le cas où celles qui sont demandées ne sont pas trouvées. Sachant cela, cette référence n’a rien à faire dans un référentiel de données mais doit être dans un référentiel propre à ton application. De ce fait, oui il y a de la redondance que tu n’aurai pas si tu utiliserai une base de données (entre parenthèses, SQLite convient très bien). Maintenant, non, en XML on ne peut pas définir des “pointeurs” vers d’autres variables. Aussi, pour éviter les redondances, mais surtout pour une meilleur clareté des références, je te réécris l’approche la plus adaptée (à mon sens) :
<Systems default="aircraft">
<System NAME="aircraft" default="apache">
<Model ID="apache">
<Model3D>AAAA</Model3D>
<ConfigurationFile>BBBB</ConfigurationFile>
</Model>
<Model ID="hind">
<Model3D>CCCP</Model3D>
<ConfigurationFile>DDDD</ConfigurationFile>
</DefaultModel>
</System>
<System NAME="BOAT" default="ferry">
<Model ID="Ferry">
<Model3D>CCCC</Model3D>
<ConfigurationFile>DDDD</ConfigurationFile>
</Model>
</System>
</Systems>
Donc tes éléments par défaut sont référencés au niveau de chaque noeud.
Edité le 21/05/2009 à 12:46
merci martopioche,
cette structure m’a facilité les choses, avec deux requettes XPath me suffit :).
A+