• Aucun résultat trouvé

Récupérer et analyser un document

Je vais dans ce paragraphe vous montrer comment procéder pour récupérer et analyser simplement un fichier XML depuis votre page JSP. Je reprends le fichier XML que j'ai utilisé précédemment lorsque je vous ai présenté la syntaxe du langage XPath, et je

le nomme monDocument.xml.

Commençons par aborder la récupération du fichier XML. Cette étape correspond simplement à un import, réalisé avec ce tag de la bibliothèque Core que vous devez déjà connaître :

Code : JSP

<c:import url="monDocument.xml" varReader="monReader"> ...

</c:import>

Remarquez l'utilisation de l'attribut varReader. C'est en quelque sorte un buffer, une variable qui sera utilisée pour une utilisation postérieure du contenu du fichier importé. Notez que lorsque vous utiliserez cet attribut, il vous sera impossible d'utiliser conjointement l'attribut var.

Rappelez-vous, lorsque l'on utilise cet attribut varReader, le contenu du fichier importé n'est pas inclus littéralement dans votre page JSP comme c'est le cas lors d'un import simple : il est copié dans la variable nommée dans l'attribut varReader.

Le document XML étant récupéré et stocké dans la variable monReader, nous souhaitons maintenant l'analyser. Nous allons pour cela faire intervenir une nouvelle balise, issue de la librairie xml cette fois :

Code : JSP

<c:import url="monDocument.xml" varReader="monReader">

<%-- Parse le contenu du fichier XML monDocument.xml dans une variable nommée 'doc' --%>

<x:parse var="doc" doc="${monReader}" /> ...

</c:import>

Deux attributs sont ici utilisés :

var : contient le nom de la variable de scope qui contiendra les données qui représentent notre document XML parsé. Comme d'habitude, si l'attribut scope n'est pas explicité, la portée par défaut de cette variable sera la page.

doc : permet de préciser que l'on souhaite parser le contenu de notre varReader défini précédemment lors de l'import. Souvenez-vous, le varReader ici nommé monReader est une variable, il nous faut donc utiliser une EL pour y faire référence, en l'occurrence ${monReader} !

Dans certains codes vieillissant, vous trouverez parfois dans l'utilisation de la balise <x:parse/> un attribut nommé

xml. Sachez qu'il joue le même rôle que l'attribut doc, et qu'il est déprécié : concrètement, il a été remplacé par doc, et il ne

faut donc plus l'utiliser.

Note : l'import qui stocke le fichier dans le varReader doit rester ouvert pour pouvoir appliquer un <x:parse/> sur le contenu de ce varReader ! La portée du varReader défini est en effet uniquement l'intérieur du corps du <c:import/>. Afin de pouvoir accéder à ce varReader, il ne faut donc pas fermer directement la balise d'import comme c'est le cas ci-dessous :

Code : JSP

<%-- Mauvaise utilisation du varReader --%>

<c:import url="monDocument.xml" varReader="monReader" />

Toutefois, il est possible de ne pas utiliser le varReader, et de simplement utiliser une variable de scope. Vous pourrez ainsi faire votre import, puis traiter le contenu du fichier par la suite, sans devoir travailler dans le corps de la balise d'import :

<c:import url="monDocument.xml" var="monReader" />

Cela dit, je vous conseille de travailler avec le varReader, puisque c'est l'objectif premier de cet attribut. Plusieurs remarques sont d'ores et déjà nécessaires :

Comprenez bien ici la différence entre le varReader de la balise <c:import/> et le var de la balise <x:parse/>: le premier contient le contenu brut du fichier XML, alors que le second contient le résultat du parsing du fichier XML. Pour faire simple, la JSTL utilise une structure de données qui représente notre document XML parsé, et c'est cette structure qui est stockée dans la variable définie par var.

Le type de la variable définie via cet attribut var dépendra de l'implémentation choisie par le développeur. Pour

information, il est ici possible de remplacer l'attribut var par l'attribut nommé varDom, qui permet de fixer l'implémentation utilisée : la variable ainsi définie sera de type org.w3c.dom.Document. De même, scope sera remplacé par

scopeDom. Ceci impose donc que votre fichier XML respecte l'interface Document citée précédemment. Tout cela étant vraiment spécifique, je ne m'étalerai pas davantage sur le sujet et je vous renvoie à la documentation pour plus d'infos. Importer un fichier n'est pas nécessaire. Il est en effet possible de traiter directement un flux XML depuis la page JSP, en le plaçant dans le corps de la balise <x:parse/> :

Code : JSP

<%-- Parse le flux XML contenu dans le corps de la balise --%> <x:parse var="doc">

<news> <article id="1"> <auteur>Pierre</auteur> <titre>Foo...</titre> <contenu>...bar !</contenu> </article> <article id="27"> <auteur>Paul</auteur>

<titre>Bientôt un LdZ J2EE !</titre> <contenu>Woot ?</contenu>

</article>

<article id="102"> <auteur>Jacques</auteur>

<titre>Coyote court toujours</titre> <contenu>Bip bip !</contenu>

</article> </news> </x:parse>

Il reste seulement deux attributs que je n'ai pas encore abordés :

filter : permet de limiter le contenu traité par l'action de parsing <x:parse/> à une portion d'un flux XML seulement. Cet attribut peut s'avérer utile lors de l'analyse de documents XML lourds, afin de ne pas détériorer les performances à l'exécution de votre page. Pour plus d'information sur ces filtres de type XMLFilter, essayez la documentation. systemId : cet attribut ne vous sera utile que si votre fichier XML contient des références vers des entités externes. Vous devez y saisir l'adresse URI qui permettra de résoudre les liens relatifs contenus dans votre fichier XML. Bref rappel : une référence à une entité externe dans un fichier XML est utilisée pour y inclure un fichier externe, principalement lorsque des données ou textes sont trop longs et qu'il est plus simple de les garder dans un fichier à part. Le processus accèdera à ces fichiers externes lors du parsage du document XML spécifié.

Je n'ai pour ces derniers pas d'exemple trivial à vous proposer. Je fais donc volontairement l'impasse ici, je pense que ceux parmi vous qui connaissent et ont déjà manipulé les filtres XML et les entités externes comprendront aisément de quoi il retourne.