Dans cet exercice, on va modéliser un arbre binaire de noeuds de 2 façons.
Conceptuellement, un noeud contient des données arbitraires (eg. #PCDATA ou CDATA,
ou xsd:string avec les schémas), et a un fils gauche et un fils droit,
facultatifs, qui sont eux-mêmes des noeuds ou des références vers des noeuds.
Le caractère 'gauche' ou 'droit' des fils est important. L'exemple ci-contre, qui est
un arbre binaire de recherche,
le montre bien.
Représentation ambigüe (donc ratée)
Pourquoi ne peut-on pas bien représenter un arbre binaire en utilisant une seule sorte
d'élément noeud (disons, sans utiliser d'attribut) ?
Écrivez une courte explication dans un fichier 2.1.txt.
Si vous ne trouvez pas: tentez de représenter l'exemple ci-contre. Où est l'ambiguïté?
RENDU: 2.1.txt
Représentation récursive
On va utiliser deux types d'éléments:
- noeud, qui s'auto-inclura si besoin, et sera également
utilisé comme élément racine du document (on renonce à pouvoir représenter un arbre
vide)
- nil, qui servira à représenter un noeud absent (permettant donc de représenter des arbres ou le fils gauche, ou droit, ou les deux, peuvent être absents).
Les données des noeuds seront dans un attribut data
(Note: on aurait aussi pu utiliser des noeuds à contenu mixte, mais il faut choisir une
convention pour les auto-tests, et on choisit celle-là pour cet exercice).
- Écrire un fichier 2.2.xml représentant l'arbre illustré
ci-contre.
RENDU: 2.2.xml
- Écrire une DTD 2.2.dtd qui valide ce XML.
RENDU: 2.2.dtd
- Écrire un schéma 2.2.xsd qui le valide.
RENDU: 2.2.xsd
Vérifiez vos XML, DTD et schéma et corrigez les:
rm 2.2.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td4/2.2.tar.gz
tar xf 2.2.tar.gz
./2.2.test.sh
Représentation plate et par référence
On va utiliser un élément racine arbre qui contiendra une liste (potentiellement vide)
de noeud.
Chaque noeud fera référence à ses fils droit et gauche (optionels) à l'aide d'attributs
gauche et droit pointant vers un attribut id des noeuds correspondant,
et aura ses données propres en tant que contenu simple.
Pensez à ID et IDREF pour les DTD, cf le TD 3 ou le Cours.
[Optionel]: L'élément racine arbre pointera vers le noeud qui est la racine de l'arbre à
l'aide d'un attribut racine, tout comme les attributs gauche et droit des noeuds.
- Écrire l'arbre illustré ci-contre en XML.
RENDU: 2.3.xml
- Écrire une DTD qui valide ce XML.
RENDU: 2.3.dtd
- Écrire un schéma qui le valide.
RENDU: 2.3.xsd
Vérifiez votre DTD et votre schéma, et corrigez-les:
rm 2.3.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td4/2.3.tar.gz
tar xf 2.3.tar.gz
./2.3.test.sh
- (*) Copiez votre schema dans 2.4.xsd et modifiez-le (si nécéssaire) pour utiliser xsd:key et xsk:keyref, cf Cours.
Vérifiez avec: ./2.4.test.sh
RENDU: 2.4.xsd
- Quels sont les avantages et inconvénients de ces 2 representations? Ecrivez une courte
explication dans un fichier 2.5.txt.
- Pensez à des arbres immenses (plusieurs millions de noeuds).
- Pensez à la capacité de validation -- peut-on faire un arbre invalide
qui passe le schéma?
RENDU: 2.5.txt
|
|