Le TD 6-7

Transcription

Le TD 6-7
Données et connaissances pour le Web
M2 Miage
TD no 6-7
Préliminaires
0.1 JAXP
On utilise l’API JAXP de la bibliothèque standard Java. On peut donc simplement compiler les programmes à l’aide de :
javac Toto.java
Et les exécuter avec :
java -cp . Toto
notez la présence du « . » et l’absence de « .java » ou « .class » Toutes les informations dont vous avez
besoin sont contenues dans la javadoc :
http://download.oracle.com/javase/8/docs/api/
1 Statistiques sur les fichiers XML
On utilise dans cet exercice l’API générique JAXP de la bibliothèque standard Java ainsi que le modèle
DOM, contenus dans le package org.w3c.dom.
Q1 Écrire un programme Java qui possède une méthode loadDocument(String fichier) renvoyant l’objet
Document correspondant au fichier (ou levant une exception le cas échéant). Charger le fichier donné sur la
ligne de commande dans la méthode main de la classe.
Q2
Modifiez votre programme pour qu’il affiche les statistiques suivantes :
— Nombre de nœuds de types élément
— Nombre de nœuds textes
— Nombre de commentaires
On peut parcourir un arbre DOM en utilisant l’interface Node (que la classe Document implémente).
Q3
Modifiez maintenant votre programme pour afficher en plus le nombre de nœuds attributs.
Q4
Modifiez votre programme pour afficher pour chaque tag le nombre de ses occurences.
Q5 Modifiez votre programme pour qu’il affiche le ratio entre la taille du fichier et le nombre de caractères
se trouvant dans les noeuds de type texte.
Q6 pour chacune des fonctionalités des questions Q2 à Q5 dire si on a réelement besoin de conserver
tout le document en mémoire.
1
2 Création de DOM from scratch
Écrire une classe Java DOMTransform ayant le squelette suivant :
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
public class DOMTransform {
Document doc_;
public DOMTransform () {}
public void createDocument(int n) {
..
.
}
public static void main(String [] args) {
DOMTransform d = new DOMTransform();
d.createDocument(1000);
}
}
On souhaite que la méthode createDocument crée en mémoire un arbre DOM correspondant à un
document XML similaire à celui décrit à la figure 1. Toutes les informations dont vous avez besoin sont
contenues dans la javadoc :
http://download.oracle.com/javase/8/docs/api/
Il suffit de lire les documentations des classes importées.
<doc>
<num>
<num>
<num>
<num>
..
.
<a>1</a>
<a>2</a>
<a>3</a>
<a>4</a>
<b>2</b>
<b>5</b>
<b>6</b>
<b>1</b>
</num>
</num>
</num>
</num>
</doc>
FIGURE 1 – Exemple de document XML. Les nombres sont arbitraires (vous pouvez choisir 1 partout pour
simplifier, ou utiliser la classe Random().
3 Application d’une transformation XSLT
Transformation d’exemple Écrire une transformation XSLT (très simple) qui prend en entrée des documents comme celui de la figure 1 et qui produise un document XHTML ressemblant à :
2
a=1 ; b=2 ; a+b=3 ;
a=1 ; b=5 ; a+b=7 ;
a=3 ; b=6 ; a+b=9 ;
a=4 ; b=1 ; a+b=5 ;
..
.
Testez votre transformation XSLT au moyen d’xmlstarlet ou de firefox.
On souhaite maintenant rajouter une méthode
transformDocument(String xslfile, String outfile)
qui prennent en argument une feuille de style XSLT et un nom de fichier, applique la transformation à l’arbre
DOM crée par la méthode createDocument() et sauve le résultat dans le fichier outfile. Il faut rajouter aux
packages importés :
import java.io.FileOutputStream;
import
import
import
import
import
javax.xml.transform.Transformer;
javax.xml.transform.TransformerFactory;
javax.xml.transform.stream.StreamResult;
javax.xml.transform.stream.StreamSource;
javax.xml.transform.dom.DOMSource;
On s’interessera notemment à la méthode transform de la classe Transformer. Cette dernière prend en
argument des objets implémentant les interfaces Source et Result. Il existe plusieurs classes implémentant
ces interfaces : StreamSource, StreamResult, DOMSource, DOMResult, . . .. Elles permettent par exemple de lire
la source depuis un fichier d’appliquer la transformation et de stocker le résultat dans un arbre DOM ou
inversement.
3