Data Mining - DESS ASS, 2002
Christophe PHARÈS
Mathieu DECORE


****************
* Avant-propos *
****************

Pour utiliser notre archive, il faut que la variable d'environnement CLASSPATH
contienne au moins les archives suivantes :

    o Pour Xalan/Xerces :
        xalan.jar xercesImpl.jar xml-apis.jar

    o Pour SVG :
        svg.jar xerces.jar ss_css2.jar js.jar

Toutes les commandes indiquées se font à partir du répertoire racine du
projet (Data-Mining). Les noms des fichiers XML, DTD, HTML et SVG n'étant
définits que dans le Makefile de cette racine (pour des raisons de simplicité
de maintenance), lancer une commande make dans un des sous-répertoires du
projet se solderait par un échec. Pour plus de simplicité, lancer simplement
les commandes à partir du même répertoire, le Makefile se charge du reste.

Pour la compilation des fichiers Java, la commande javac est utilisée par
défaut. Pour utiliser une autre commande (comme jikes, par exemple), ajouter
simplement à chaque appel de make l'option JAVAC=jikes (make JAVAC=jikes).


************************************************
* Création du fichier XML à partir des données *
************************************************

Comme on utilise DOM pour cette partie, afin de générer plus facilement
le fichier XML à partir d'un arbre DOM, on a "tronqué" les fichiers de
données à 100 accidents, batiments et villes. Ces fichiers se trouvent
dans le sous-répertoire S1A/data. Les fichiers de données originaux
fonctionnent quand même (la moulinette arrête la lecture des données avant
qu'il n'y ait plus de mémoire disponible), mais l'exécution est beaucoup
plus longue.

Pour générer le fichier XML, taper :


-------------------------------------------------------------------------------

$ make xml
(cd S1A && make test JAVAC=javac FIC_XML=carte.xml \
        FIC_DTD=carte.dtd)
javac applixml/Token.java
javac applixml/txtToXml.java
javac applixml/XmlToTxt.java
javac applixml/testTxtToXml.java
javac applixml/AppliXML.java
./run_text -OUT carte.xml
Getting accidents from files data/accident_sem-100 and data/accident_sem-100 done.
Getting buildings from files data/lille_bt_sem-100 and data/lille_bt_sem-100 done.
Getting roads from files data/lille_ni_sem-100 and data/lille_ni_sem-100 done.
Now building tree...
Adding accidents to tree done.
Adding buildings to tree done.
Adding roads to tree done.
Writing output file : carte.xml done.
$ 

-------------------------------------------------------------------------------


Le fichier généré ici s'appelle carte.xml, comme l'indique la dernière
ligne (Writing output file : carte.xml done.). Pour générer un fichier
XML portant un autre nom, préciser en argument l'option FIC_XML :


-------------------------------------------------------------------------------

$ make xml FIC_XML=lille.xml
(cd S1A && make test JAVAC=javac FIC_XML=lille.xml \
        FIC_DTD=carte.dtd)
./run_text -OUT lille.xml
Getting accidents from files data/accident_sem-100 and data/accident_sem-100 done.
Getting buildings from files data/lille_bt_sem-100 and data/lille_bt_sem-100 done.
Getting roads from files data/lille_ni_sem-100 and data/lille_ni_sem-100 done.
Now building tree...
Adding accidents to tree done.
Adding buildings to tree done.
Adding roads to tree done.
Writing output file : lille.xml done.
$

-------------------------------------------------------------------------------


Une interface graphique est disponible pour faciliter l'utilisation de
la moulinette. Pour une utilisation rapide, on préconise néanmoins la
précédente méthode (make xml).
Pour avoir une interface graphique (utilisant Swing), taper simplement :


-------------------------------------------------------------------------------

$ make interface &
[2] 56406
(cd S1A && make dom JAVAC=javac FIC_XML=carte.xml \
FIC_DTD=carte.dtd)
./run
$

-------------------------------------------------------------------------------


Cliquer sur le boutton "TXT -> XML" (voir welcome.gif).
Il y a alors une interface permettant de créer le fichier XML comme tout à
l'heure. Pour utiliser les fichiers par défaut, laisser tel quel et cliquer
simplement sur "Start" (voir txt2xml.gif).
Le fichier généré est carte.xml à la racine du projet (comme pour la méthode
utilisant Sax).
Cliquer sur "Sortir" pour revenir à l'interface principale.

Le DTD de notre fichier XML a un nom fixe, carte.dtd. Il se trouve à la
racine du projet.


****************************
* Parser notre fichier XML *
****************************

Pour parser notre fichier XML, on peut utiliser soit DOM, soit SAX. La version
avec DOM permet l'affichage d'une interface graphique, la version avec SAX
se fait en mode texte.

+------------------+
| Version avec SAX |
+------------------+

Pour utiliser la version avec SAX, taper simplement :


-------------------------------------------------------------------------------

$ make sax
(cd S1D && make test JAVAC=javac FIC_XML=carte.xml \
FIC_DTD=carte.dtd)
cp ../carte.xml .
cp ../carte.dtd .
java Sax carte.xml


Balise cartes
Balise accident
Balise id : 0 
Balise nombrePersonnes : Nb Pers 6 
Balise lieu : VoiePublic 
Balise localisation : Localisation 0 
Balise nuage
Balise point  
    attribut de point : x valeur : 2362527  
    attribut de point : y valeur : 1002280 
Balise point  
    attribut de point : x valeur : 2362557  
    attribut de point : y valeur : 1021707 
Balise point  
    attribut de point : x valeur : 2367206  
    attribut de point : y valeur : 1016190 
Balise point  
    attribut de point : x valeur : 2361008  
    attribut de point : y valeur : 1115500 
Balise point  
    attribut de point : x valeur : 2365152  
    attribut de point : y valeur : 1007646 
Balise point  
    attribut de point : x valeur : 2374944  
    attribut de point : y valeur : 1340045 
Balise point  
    attribut de point : x valeur : 2031845  
    attribut de point : y valeur : 1977906 
Balise point  
    attribut de point : x valeur : 2031845  
    attribut de point : y valeur : 1977906 
Balise point  
    attribut de point : x valeur : 2031845  
    attribut de point : y valeur : 1977906 
Balise point  
    attribut de point : x valeur : 2031845  
    attribut de point : y valeur : 1977906   
Balise accident
Balise id : 1 
Balise nombrePersonnes : Nb Pers 9 
Balise lieu : Carrefour 
Balise localisation : Localisation 1 
Balise nuage

[...]

Balise route
Balise id : 99 
Balise debit : Debit 4 
Balise type : L 
Balise distance : Distance 99 
Balise ligne
Balise point  
    attribut de point : x valeur : 237049  
    attribut de point : y valeur : 513154 
Balise point  
    attribut de point : x valeur : 241449  
    attribut de point : y valeur : 508509    
$

-------------------------------------------------------------------------------


Comme précédemment, l'option FIC_XML passée à make permet de préciser quel
fichier XML on veut parser :


-------------------------------------------------------------------------------

$ make sax FIC_XML=lille.xml
(cd S1D && make test JAVAC=javac FIC_XML=lille.xml \
FIC_DTD=carte.dtd)
cp ../lille.xml .
cp ../carte.dtd .
java Sax lille.xml


Balise cartes
Balise accident
Balise id : 0 
Balise nombrePersonnes : Nb Pers 6 
Balise lieu : VoiePublic 
Balise localisation : Localisation 0 
Balise nuage
Balise point  
    attribut de point : x valeur : 2362527  
    attribut de point : y valeur : 1002280 
Balise point  
    attribut de point : x valeur : 2362557  
    attribut de point : y valeur : 1021707 

[...]

$

-------------------------------------------------------------------------------


+------------------+
| Version avec DOM |
+------------------+

La version avec DOM utilise une interface graphique. Pour avoir une
interface graphique (utilisant Swing), taper simplement :


-------------------------------------------------------------------------------

$ make interface &
[2] 56406
(cd S1A && make dom JAVAC=javac FIC_XML=carte.xml \
FIC_DTD=carte.dtd)
./run
$

-------------------------------------------------------------------------------


Cliquer sur le boutton "XML -> TXT" (voir welcome.gif).
Il y a alors une interface permettant de visualiser le fichier XML.
Pour utilisr le fichier précédemment générer, laisser tel quel le nom du
fichier XML (voir xml2txt.gif).
Une fois le bouton "Start" appuyé, et si les noms des fichiers sont corrects
(auquel cas aucune exception de type java.io.FileNotFoundException n'est
générée) s'affiche l'interface graphique. Cliquer alors sur l'onglet "Route",
puis sur les autres onglets.
Cliquer sur "Sortir" pour revenir à l'interface principale.


************************
* Calcul du barycentre *
************************

Le calcul du barycentre se fait dans la version DOM/Swing. Pour l'utiliser,
suivre les instructions précédentes (version avec DOM), et l'affichage du
barycentre se fait sur le dernier panneau affiché.


******************************
* Validation du document XML *
******************************

La validation du document XML se fait en tapant :


-------------------------------------------------------------------------------

$ make validate
(cd S2A && make test JAVAC=javac FIC_XML=carte.xml \
         FIC_DTD=carte.dtd)
cp ../carte.xml .
cp ../carte.dtd .
java Validate carte.xml
VALID carte.xml
================SUMMARY=============================
1 file is valid.
$

-------------------------------------------------------------------------------


et comme toujours on peut specifier le nom du fichier XML à valider :


-------------------------------------------------------------------------------

$ make validate FIC_XML=lille.xml
(cd S2A && make test JAVAC=javac FIC_XML=lille.xml \
         FIC_DTD=carte.dtd)
cp ../lille.xml .
cp ../carte.dtd .
java Validate lille.xml
VALID lille.xml
================SUMMARY=============================
1 file is valid.
$

-------------------------------------------------------------------------------


La commande xmllint --valid --noout ./carte.xml permet également de valider
notre document XML.


*************************************************
* Generation de la version HTML du document XML *
*************************************************

Une version HTML de notre document XML peut être générée simplement :


-------------------------------------------------------------------------------

$ make html
java org.apache.xalan.xslt.Process -IN carte.xml -XSL carte.xsl -OUT carte.html

$

-------------------------------------------------------------------------------


Le document généré est le fichier carte.html.

On peut spécifier le nom du fichier XML à valider :


-------------------------------------------------------------------------------

$ make html FIC_XML=lille.xml 
java org.apache.xalan.xslt.Process -IN lille.xml -XSL carte.xsl -OUT carte.html

$

-------------------------------------------------------------------------------


**************************
* Générer un fichier SVG *
**************************

Pour générer un document SVG à partir de notre document XML, taper :


-------------------------------------------------------------------------------

$ make svg
(cd S2C && make test JAVAC=javac FIC_XML=carte.xml \
FIC_DTD=carte.dtd FIC_SVG=carte.svg)
javac Svg.java
cp ../carte.xml .
cp ../carte.dtd .
java Svg carte.xml -OUT ../carte.svg
$

-------------------------------------------------------------------------------


Le document SVG ainsi généré se nomme carte.svg à la racine du projet.

On peut le visualier simplement en tapant :


-------------------------------------------------------------------------------

$ make visu
java org.csiro.svg.viewer.Viewer carte.svg
$

-------------------------------------------------------------------------------


Il s'affiche alors l'interface graphique (si les bons fichiers ".jar" sont
dans le CLASSPATH) (cf. svg.gif).

Noter qu'un astuce a été utilisée afin de pouvoir visualiser notre fichier :
comme les coordonnées sont grandes, chaque coordonné supérieure à 1000 est
convertie en son modulo 1000 dans le fichier SVG. Pour désactiver ceci,
enlever le commentaire à la ligne suivante dans le fichier S2C/Svg.java :
    //    boolean Mod1000 = false;

Une image au format JPEG peut être obtenue en tapant :


-------------------------------------------------------------------------------

$ make jpeg
java org.csiro.svg.tools.SvgToJpegConverter carte.svg carte.jpeg
$

-------------------------------------------------------------------------------


L'image se nomme alors carte.jpeg.


******************
* Utiliser XPath *
******************

Pour utiliser XPath, taper simplement :


-------------------------------------------------------------------------------

$ make xpath | less
$

-------------------------------------------------------------------------------


Les requettes XPath suivantes sont passées (chercher la chaîne de caractères
"-*-" pour passer d'une requette à l'autre) :

    o -*- Tous le fichier XML -*-
Loading classes, parsing carte.xml, and setting up serializer
Querying DOM using /
<output>
<cartes>
    <accident>
        <id>0</id>
        <nombrePersonnes>Nb Pers 6</nombrePersonnes>
        <lieu>VoiePublic</lieu>
        <localisation>Localisation 0</localisation>
        <nuage>
            <point x="2362527" y="1002280"/>
            <point x="2362557" y="1021707"/>
            <point x="2367206" y="1016190"/>
            <point x="2361008" y="1115500"/>
            <point x="2365152" y="1007646"/>
            <point x="2374944" y="1340045"/>
            <point x="2031845" y="1977906"/>
            <point x="2031845" y="1977906"/>
            <point x="2031845" y="1977906"/>
            <point x="2031845" y="1977906"/>
        </nuage>
    </accident>
    <accident>
        <id>1</id>
        <nombrePersonnes>Nb Pers 9</nombrePersonnes>
        <lieu>Carrefour</lieu>
        <localisation>Localisation 1</localisation>
        <nuage>
            <point x="2073334" y="1865215"/>
            <point x="1573643" y="2655772"/>
            <point x="2472309" y="1658284"/>
            <point x="2472309" y="1658284"/>
            <point x="1021300" y="2234738"/>
            <point x="533203" y="75796"/>
            <point x="2751582" y="1500075"/>
            <point x="2751582" y="1500075"/>
            <point x="1541860" y="1440524"/>
            <point x="2985587" y="1744122"/>
        </nuage>
    </accident>

    o -*- Les id de toutes les routes -*-
Loading classes, parsing carte.xml, and setting up serializer
Querying DOM using /cartes/route/id
<output>
<id>0</id>
<id>1</id>
<id>2</id>
<id>3</id>
<id>4</id>
<id>5</id>
<id>6</id>
<id>7</id>
<id>8</id>

    o -*- Les id de toutes les balises -*-
Loading classes, parsing carte.xml, and setting up serializer
Querying DOM using /cartes/*/id
<output>
<id>0</id>
<id>1</id>
<id>2</id>
<id>3</id>
<id>4</id>
<id>5</id>
<id>6</id>
<id>7</id>
<id>8</id>
<id>9</id>
<id>10</id>
<id>11</id>

    o -*- Le huitieme accident -*-
Loading classes, parsing carte.xml, and setting up serializer
Querying DOM using /cartes/accident[8]
<output>
<accident>
        <id>7</id>
        <nombrePersonnes>Nb Pers 2</nombrePersonnes>
        <lieu>Trotoire</lieu>
        <localisation>Localisation 7</localisation>
        <nuage>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
            <point x="2576590" y="1974956"/>
        </nuage>
    </accident>
</output>

    o -*- Tous les nuages ayant au moins un point avec x=2576590 -*-
Loading classes, parsing carte.xml, and setting up serializer
Querying DOM using //nuage/point[@x=2576590]
<output>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
<point x="2576590" y="1974956"/>
</output>
