[Home] [Travaux] [Rapport exercice 5]

Rapport exercice 5

Objectifs

Le but de cet exercice, est à mon sens, de construire un petit dispositif xml simple mais complet. Il s'agit ainsi de construire une grammaire permettant de modéliser une catégorie de documents. Achetant souvent des cd, j'aime bien avoir une liste de ceux que je possède; ainsi, je me suis dirigé vers un modèle de fiche pour chaque cd. Une liste peut ainsi être constituée avec toutes ces fiches. La grammaire est donc evidemment très simple, elle comporte les informations sur chaque cd : interprète, titre, date, studio d'enregistrement, commentaires, pochette... Le document xml sera ainsi valide : well formed, possèdant un dtd (et conforme à celui-ci).

Comme le fait de rajouter des cd directement dans le document xml est pénible, un formulaire (traité par php) pourra mettre à jour la liste. Cette liste est à usage personnelle, seul son auteur est censé rajouter des éléments. Toutefois, comme c'est un exercice STAF, n'importe quel utilisateur peut venir rajouter des cd. Cela me permet également de faire un essai de genèse de xml avec php. J'ai modifié les permissions pour que n'importe quel utilisateur puisse rajouter des items.

Un troisième objectif consiste aussi à voir plusieurs méthodes pour afficher du XML dans un browser : avec XSl et cocoon ainsi qu'avec un parsing php. Je testerais les deux méthodes : XSL pour l'affichage simple et le parsing php pour essayer un petit moteur de recherche (permettant de retrouver un cd grâce au nom de l'interprète).

Réalisation, technique et embûches

J'ai commencé par créer un DTD simple qui prend en compte plusieurs éléments. Le parent est liste (c'est à partir de lui que tout descendra). Il y a deux autres éléments parents (à des niveaux inférieurs de la liste) : fiche (qui comporte toute la description du cd) puis techniques (avec quatres éléments "enfants"). Le parsing php fait par Vivian permet de visualiser l'arbre XML. Je suis parti de 8 éléments (le titre de l'album, l'interprète, le style, le producteur, le studio, le label et des commentaires) pour décrire un cd, avec un attribut qui est la pochette (attribut d'une fiche). Le parsing est effectué par Cocoon et j'ai choisi d'utiliser une feuille de style XSL qui fait un tableau et place les différents éléments (avec l'instruction xsl:value-of select qui convient bien ici pour des données de type tabulaire (on aurait également pu établir des règles, mais j'ai choisi la solution de facilité :) donnés dans la feuille XML. Je voulais aussi faire en sorte que les données soient triées par ordre alphabétique sur le nom de l'interprète, c'est ce que j'ai fait (avec l'aide de Vivian, thanx :) en utilisant la fonction xsl sort.

Le formulaire est fait en html, et c'est un script php (modifié à partir de celui trouvé chez Olivier Clavel) qui va faire le traitement. Ce script va ouvrir le fichier XML, et remplacer la dernière ligne par une nouvelle fiche, puis refermer cette page (avec le tag parent qui est "liste" en l'occurence). On utilise la fonction StripSlashes(); qui élimine les slashs rajoutés lors de l'envoi du formulaire. On utilise les fonctions php classiques (fopen();...) et un pointeur pour écrire dans le document XML.

En ce qui concerne le petit moteur de recherche, j'ai réutilisé et modifié un des scripts de Vivian (montré en cours) que j'ai modifié en fonction de mon dtd et de l'affichage que je voulais obtenir en html. L'affichage est le même que pour la liste, sauf qu'ici on n'affiche que le cd de l'artiste demandé. J'ai du pour cela utiliser une expression régulière avec php : eregi();, j'ai trouvé les information nécessaire sur http://www.php.net/manual/en/function.ereg.php. Cette expression régulière a été améliorée : avec des wild cards (*), l'utilisateur peut ainsi fournir seulement des parties du nom de l'interprète et la recherche se fait toujours. Le plus dur aura été de parser correctement le xml, des warnings m'ont vraiment freinés (merci à Vivian pour son aide).
Au niveau des outils, je n'ai utilisé que EMacs...

Critiques et limites

Les critiques ci-dessous seraient à prendre en compte si l'on veut construire un véritable dispositif opérationnel (avec le temps adéquat pour le construire). Les principales limites de ce dispositif sont clairement d'ordre conceptuelles : il ne faut pas qu'il y ait trop de cd, sinon l'utilisateur devra scroller; c'est pour cela que l'utilisation d'un moteur de recherche sur des items comme le style ou le nom de l'interprète est plus judicieux.

En ce qui concerne le formulaire, il est trop simple et l'interaction avec l'utilisateur est finalement assez pauvre : on ne peut que rajouter des cd, et pas modifier une fiche ou en effacer. Il faudrait prévoir plus de souplesses dans les interactions possibles avec l'utlisateur... (ce n'était pas le but de cet exercice, j'ai juste voulu tester la genèse de xml par php). Je me pose également la question de la maintenance/réutilisation de mes données (les fiches). A posteriori, il me semble que j'aurais du générer des fichiers séparés pour chaque fiche (des fichiers txt qui se seraient intégrés dans un fichier xml); cela aurait permis un accès plus facile pour réutiliser l'information... Finalement, il m'apparait que ce genre de dispositif serait plus facile et plus intéressant à mettre en oeuvre avec un véritable langage de base de données relationnelles (mySQL par exemple) : cela procurerait une plus grande flexibilité/souplesse avec php (quant à la gestion des fiches : effacer, modifier...). XML me semble plus difficile d'accès par rapport à mysql pour ces traitements. Enfin, le moteur de recherche n'est évidemment pas complet, on pourrait imaginer des recherches sur le titre de l'album, la date, le producteur; il suffirait d'écrire d'autres fichiers php parsant différemment le document xml.

Bibliographie


© N.Nova (Février 2001).