DOM et validation DTD

Eléphanteau du PHP | 23 Messages

16 août 2005, 22:45

Salut à tous !

Voilà, je suis en train d'écrire une classe permettant de se servir de XML comme d'une base de données SQL. Je cherche un moyen pour définir la structure des tables et je me suis dit qu'une DTD pouvait être la solution, mais j'ai encore un peu de mal à comprendre le fonctionnement des DTD avec PHP DOM...
J'ai vu qu'il était possible d'attacher une feuille DTD externe grâce à DOMImplementation->createDocumentType()

Mais je ne vois pas de fonction permettant de gérer le contenu de la DTD... :?
Quelqu'un aurait une idée?

Mammouth du PHP | 19672 Messages

16 août 2005, 23:10

On ne gère pas vraiment le contenu d'une DTD : on établit une DTD à la base et ensuite on gère le contenu du fichier XML en fonction de cette DTD. Le plus souvent on crée la DTD manuellement et ensuite on ne s'en occupe plus si ce n'est pour l'ajouter dans le DOCTYPE de ton fichier XML.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 23 Messages

16 août 2005, 23:16

OK, donc il faudrait gérer dynamiquement la DTD avec des fonctions de fichier. Le problème, c'est que je suis un (beaucoup) nul avec ces fonctions :oops: ... Tu as une idée sur comment je pourrais gérer ça?

En gros, il faudrait que lorsque j'appelle une méthode de ma classe xmsql pour créer une "table", cela agisse sur la DTD. Elle est créée si elle n'existe pas ou éventuellement modifiée si on demande la modification de la structure.

Merci d'avance :)

Mammouth du PHP | 19672 Messages

16 août 2005, 23:20

Non, et je crois que tu n'as pas saisi ce qu'est vraiment une DTD :-k Avant que je me lance dans des explication, dis-moi donc ton interprétation de ce que c'est.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 23 Messages

16 août 2005, 23:27

Ben en fait, j'ai une idée assez floue de ce que c'est réellement. A vrai dire, j'ai commencé à découvrir de ce que c'était ce matin :lol: . D'après ce que j'ai pu comprendre, c'est la définition de type du fichier XML qui l'associe, la définition de la structure (enfin je crois).
En voyant ça, je me suis dit que cela pouvait m'aider dans le développement de ma classe, car pour le moment je n'ai aucun moyen de contrôler la structure de mes "tables", comme pour une table SQL, et notamment en ce qui concerne le nombre de champs et leurs appellations.

Mammouth du PHP | 19672 Messages

16 août 2005, 23:40

Ok, alors d'abord, dis-toi que pour un stockage en fichier XML, tu n'as pas obligatoirement besoin d'une DTD.

En revanche, une DTD apporte une cohérence dans la structure de ton fichier XML. La DTD, ou Document Type Definition est en quelque sorte la grammaire du fichier XML qui s'y raccorde: ça indique quel type d'éléments contient ton fichier, quels éléments sont obligatoires ou facultatifs, le type de contenu, les attributs éventuels et leurs valeurs/type de valeurs etc... C'est pour ça qu'on ne s'amuse pas à tripatouiller dedans en permanence. On fixe la DTD à la base et on y touche plus. mais concevoir une DTD exige une analyse poussée.

Pour voir de quoi peut avoir l'air une base de données au format XML que tu créerais toi-même, va sur www.fabforce.net et télécharges DBDesigner. C'est un outil de modélisation pour MySQL qui crée un Modèle Physique de Données . Ce Modèle est ensuite enregistré au format XML. Crée une petite modélisation basique et enregistre ça, puis ouvre le fichier XML. À partir de là, tu pourrais envisager de construire une DTD en t'inspirant du modèle. Pour ma part, c'est ce que je ferais: une maquette debase avec toutes les sortes d'éléments que je veux pouvoir trouver et ensuite je fais la DTD. Quand ça c'est fait, je crées ensuite mes fichiers XML normaux sur la base de cette DTD.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 23 Messages

16 août 2005, 23:56

Oki, merci je vais me pencher là-dessus :)