Le projet : un peu de XML

publicité
Master 1 Informatique, AMU
Programmation Fonctionnelle 2015, Projet, p. 1
Le projet : un peu de XML
Version du 10 novembre 2015
Xml (Extensible Markup Language) est, à l’origine une généralisation de html et sgml. Vous pouvez consulter
la page Xml de Wikipedia
https://fr.wikipedia.org/wiki/Extensible_Markup_Language
pour plus d’information sur l’historique de ce langage comme pour toute autre information qui vous sera
nécessaire.
Commme pour html, un document Xml peut se représenter en forme arborescente. Par exemple, le document
suivant sur la gauche peut se représenter par l’arbre de droite :
< books >
< book language =" French " >
< title > D é sert </ title >
< author > Le Cl é zio </ author >
</ book >
< book >
< title >
Contes du XIX è me si è cle
</ title >
< author > Flaubert </ author >
< author > Gautier </ author >
</ book >
</ books >
books
book
title
Désert
book
author
title
Le Clézio
Contes ...
author
Flaubert
author
Gautier
On pense donc un document Xml comme un arbre enraciné. A chaque balise ouverte/fermée on lui fait
correspondre un noeud (un élément). Ce qui se trouve entre les balises ouvertes <??? ...> et fermées </???>
sont les fils ordonnés du du noeud. Chaque élément a un nom et, optionnellement, une liste d’attributs. Des
noeuds texte contiennent du texte et n’ont pas d’enfants.
Objectif. Nous nous proposons d’écrire un petit outil pour faire des recherches sur des documents Xml.
1
Types de données, transformations vers et depuis String
Exercice 1. Définir un type de données récursif XmlTree, adapté à coder les documents Xml en tant que
arbres.
Pour faire cela, on définira préalablement les types XmlAttribut, XmlNom et XmlText, ainsi que le type
polymorphe XmlElement a (un noeud Xml porteur d’une information de type a).
Exercice 2. Définir une fonction showXmlTree :: XmlTree -> String qui transforme un valeur de type
XmlTree dans une chaîne de caractères représentant le document Xml comme d’habitude (avec les balises).
On pourra définir préalablement des fonctions analagoues, comme
showXmlText :: XmlText -> String
showXmlNom :: XmlNom -> String
showXmlAttribut :: XmlAttribut -> String
showXmlElement :: ( a -> String ) -> XmlElement a -> String
Exercice 3. Définir une fonction parseXmlTree :: String -> Maybe XmlTree, qui fait l’analyse syntaxique (le « parsing ») d’une chaine de caractères contenant un document Xml.
Remarque.
2 DES REQUÊTES TYPE XPATH
2
1. Le document
http://www.fil.univ-lille1.fr/~hym/e/pf/tdtp/td4.pdf
peut servir pour comprendre comment écrire des parseurs élémentaires en Haskell.
2. Vous disposez aussi du modulre Parsec, voir
https://wiki.haskell.org/Parsing_expressions_and_statements
3. On pourra définir préalablement des fonctions similaires, comme readXmlText :: String -> Maybe
XmlText, readXmlNom, . . .
Exercice 4. Dans cet exercice nous nous proposons d’améliorer le traitement des erreurs dans l’analyse
syntaxique d’un document Xml. Écrivez donc une fonction
parseXmlWithErrors :: String -> Either XmlTree String.
Au lieu de retourner Nothing dans le cas que l’analyse syntaxique échoue, on retournera un message d’erreur
précisant la position dans le texte d’entrée où on trouve l’erreur.
2
Des requêtes type XPath
Nous renvoyons à la page Wikipedia de XPath
https://fr.wikipedia.org/wiki/XPath
pour une exploration préliminaire de ce langage de requêtes sur les documents Xml. Nous allons considérer
le sous-langage de XPath défini par cette grammaire :
Requete := / | P ath
P ath := / ElementConditions | / ElementConditions P ath
ElementConditions := Element | Element [ Conditions ]
Conditions := Condition | Condition , Conditions
Condition := @ N omAttribut = ‘ V alAttribut ’
où (on se permet de supposer que) Element, NomAttribut et ValAttribut sont des chaînes non vides de
caractères.
Par exemple, la requête
/ books / book / author
donnera comme résultat la liste de documents xml
< author > Le Cl é zio </ author >
< author > Flaubert </ author >
< author > Gautier </ author >
où la requête
/ books / book [ @language = ’ French ’]
donnera
< book language =" French " >
< title > D é sert </ title >
< author > Le Cl é zio </ author >
</ book >
2 DES REQUÊTES TYPE XPATH
3
Exercice 5. Définissez un type de données XPathQuery adéquat à représenter les requêtes définies par la
grammaire ci-dessus.
Exercice 6. Définissez une fonction parseXpathQuery :: String -> Maybe XPathQuery pour faire l’analyse syntaxique d’une chaîne de caractères contenant une requête.
Exercice 7. Définissez une fonction
query :: XPathQuery -> XmlTree -> [ XmlTree ]
qui appliquera la requête à un arbre Xml pour retourner une liste de sous-arbres satisfaisants la requête.
Exercice 8. Modifiez la grammaire ci-dessus de facon que, pour le non-terminal Condition on aie :
Condition := AttrN omV al | ElN omV al | Sibling
AttrV alN om := @ N omAttribut = ‘ V alAttribut ’
ElV alN om := N omEl = ‘ Chaine ’
Sibling := Chif f re
où Chiffre est un nombre, NomEl et Chaine sont des chaînes de caractères.
Pour la signification de ces conditions, voir 2.5, “Abbreviated Syntax” dans :
http://www.w3.org/TR/xpath/
Implémentez les exercices précédents pour prendre en compte cet ensemble élargi de conditions.
3 FINITION ET TESTS
3
4
Finition et tests
Pour terminer, on vous demande de produire un petit exécutable (utilisez donc ghc et/ou runhaskell à la
place de ghci) nommé searchXml pour faire des recherches sur un fichier Xml.
L’utilisation de l’exécutable sera donc comme suit :
xmlSearch xpathquery fichierxml
ou bien
xmlSearch -f fichierxpathquery fichierxml
où xpathquery est une chaîne de caractères (la requête) entre guillemets et fichierxpath est le fichier qui
contient la requête. Les résultats de la recherche seront affichés à l’écran.
Tests. Le tests (et la validation du code) sont une partie intégrante de n’importe quel projet. Un fichier
README contiendra une description précise de toute démarche prise pour valider la qualité de votre code. En
pratique : pas de tests, moins de points, plus de tests, plus de points.
Remarques
— Afin de pouvoir tester, un fichier Xml assez grand se trouve dans la page web du cours : http:
//pageperso.lif.univ-mrs.fr/~luigi.santocanale/teaching/PF/code/Projet2015/
— Le projet se déroule par binômes. Si vous n’arrivez pas à trouver un binôme, veuillez le signaler, un
binome pourra alors vous être attribué.
— Date du rendu du projet : le lundi 7/12/2015, à 23h59. Envoyez votre projet en format compressé zip
ou tgz à votre encadrant de TP.
— Si vous utilisez, dans votre projet, du code dont vous n’êtes pas complètement les auteurs, veuillez le
signaler clairement dans un fichier appelé README.txt et inclure les sources qui vous ont inspiré dans
le projet.
— Dates envisagées pour les soutenances :
— à Luminy : le vendredi 11/12/2015 (de 8h00 à 13h00) ;
— à St-Jérôme : le mercredi 9/12/2015 (de 8h00 à 16h00).
Téléchargement