Exercices de XML - Gabriel Peyrot
Transcription
Exercices de XML - Gabriel Peyrot
Exercices de XML
Gabriel PEYROT SRC2
~ Exercice 1 ~
Tout ce qui est écrit en rouge est ce qui a été rajouté pour que le fichier soit bien formé.
Fichier « bon.xml »
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<foret>
<arbre>
<tronc>
<branche>
<feuille/>
</branche>
</tronc>
</arbre>
<arbre>
<tronc/>
</arbre>
</foret>
Ajout de l'ordre de déclaration d'un fichier xml en début de fichier.
Ajout des balises </foret>.
Gabriel PEYROT SRC2
Fichier « bon2.xml »
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<foret>
<arbre>
<tronc>
<branche>
<feuille/>
</branche>
</tronc>
</arbre>
<arbre>
<tronc>
<branche>
<branche>
<feuille/>
</branche>
</branche>
</tronc>
</arbre>
</foret>
Ajout de l'ordre de déclaration d'un fichier xml en début de fichier.
Ajout d'un / à <feuille/> car c'est une balise unaire.
Ajout d'une balise fermante </tronc>.
Gabriel PEYROT SRC2
Fichier « bon3.xml »
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<foret>
<arbre>
<tronc>
<branche>
<feuille/>
</branche>
</tronc>
</arbre>
<arbre>
<tronc>
<branche>
<branche>
<feuille/>
</branche>
</branche>
</tronc>
</arbre>
</foret>
Même chose que bon2 mis à part pour </feuille> qui devient <feuille/> car c'est une balise unaire.
Gabriel PEYROT SRC2
Fichier « bon4.xml »
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<foret>
<arbre>
<tronc>
<branche>
<feuille/>
</branche>
</tronc>
</arbre>
<arbre>
<tronc>
<branche>
<branche>
<feuille/>
</branche>
</branche>
</tronc>
</arbre>
<routes>
<route source="A14" destination="E12"/>
</routes>
</foret>
Ajout de la route et de ses attributs comme demandé.
Gabriel PEYROT SRC2
~ Exercice 2 ~
Pour cet exercice on va utiliser la dtd suivante:
foret.dtd
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE foret SYSTEM "foret.dtd">
<!ELEMENT foret (arbre+,routes?)>
<!ELEMENT arbre (tronc)>
<!ELEMENT tronc (branche)>
<!ELEMENT branche (branche+|feuille)>
<!ELEMENT feuille EMPTY>
<!ELEMENT routes (route+)>
<!ELEMENT route EMPTY>
<!ATLIST route
source #REQUIRED
destination #REQUIRED>
On y défini ainsi toutes les balises et leur politique.
Gabriel PEYROT SRC2
Fichier « bon.xml »
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!DOCTYPE foret SYSTEM "foret.dtd">
<foret>
<arbre>
<tronc>
<branche>
<feuille/>
</branche>
</tronc>
</arbre>
<arbre>
<tronc/>
</arbre>
</foret>
Ajout du 'no' dans standalone car on utilise maintenant une dtd.
Ajout du doctype et définition du nom de la dtd externe dans le doctype.
On fait la même chose pour les autres fichiers bon*.xml
Gabriel PEYROT SRC2
~ Exercice 4 ~
Pour voir ce que donne l'exercice 4 au final veuillez vous rendre à l'url suivante:
http://gabriel.peyrot.free.fr/xml/ex4/xml.php5
Voici le code qui a été utilisé avec quelques explications dans les commentaires:
example.xml
dans lequel on effectuera des actions par le fichier php
<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
<title>PHP: Behind the Parser</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El Actor</actor>
</character>
</characters>
<plot>
So, this language. It's like, a programming language. Or is it a
scripting language? All is revealed in this thrilling horror spoof
of a documentary.
</plot>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie></movies>
Gabriel PEYROT SRC2
xml.php5
(attention de bien mettre l'extension .php5 car on utilise les fonctions simplexml)
<?php
//Charge le fichier example.xml dans la variable $objetXML
$objetXML=simplexml_load_file('example.xml');
echo '<h2 align="center"><u>Exemples de XML</u></h2><br/>';
// - - - - - - - - - - - Exemple 1: Obtenir <plot>
echo '<h3>Exemple 1: Obtenir <plot></h2>';
//Affiche l'intérieur de la balise plot qui se trouve dans la premiere balise movie
echo $objetXML->movie[0]->plot;
// - - - - - - - - - - - Exemple 2: Accéder à un élément non-unique avec SimpleXML
echo '<h3>Exemple 2: Accéder à un élément non-unique avec SimpleXML</h2>';
// Pour chaque <movie>, nous affichons un <plot> suivit par un <br/>
foreach ($objetXML->movie as $movie) {
echo $movie->plot, '<br />';
}
foreach ($objetXML->movie as $movie) {
echo $movie->plot, '<br />';
}
// - - - - - - - - - - - Exemple 3: Utilisation des attributs
echo '<h3>Exemple 3: Utilisation des attributs</h2>';
// Accès au noeud <rating> du premier <movie> et affichage des attributs de <rating>.
echo 'Le film a reçu ';
//Atteint les balises ratings et leur attributs. Affiche l'intérieur de la balise + la valeur de l'attribut de cette même balise.
foreach ($objetXML->movie[0]->rating as $rating) {
switch((string) $rating['type']) { // Récupération des attributs comme indices d'éléments
case 'thumbs':
Gabriel PEYROT SRC2
echo $rating, ' pouces levés et ';
break;
case 'stars':
echo $rating, ' étoiles.';
break;
}
}
// - - - - - - - - - - - Exemple 4: Comparaison des éléments et des attributs avec du texte
echo '<h3>Exemple 4: Comparaison des éléments et des attributs avec du texte</h2>';
//Si le titre est bien 'PHP: Behind the Parser' alors j'affiche 'Mon film préféré'.
if ((string) $objetXML->movie->title == 'PHP: Behind the Parser') {
echo 'Mon film préféré.';
}
// Transtipe l'element title en une chaine de caractère pour que php traite l'élément comme une chaine de caracteres au lieu d'un objet.
htmlentities((string) $objetXML->movie->title);
// - - - - - - - - - - - Exemple 5: Utilisation de XPath
echo '<h3>Exemple 5: Utilisation de XPath</h2>';
//Xpath sert à trouver tous les elements que l'on demande
//Pour tous les personnages, afficher leur nom de $character suivi de played by et enfin la balise actor de $character qui correspond
foreach ($objetXML->xpath('//character') as $character) {
echo $character->name, ' played by ', $character->actor, '<br />';
}
// - - - - - - - - - - - Exemple 6: Attribuer des valeurs
echo '<h3>Exemple 6: Attribuer des valeurs</h2>';
//Remplace Ms. Coder par Miss Coder
$objetXML->movie[0]->characters->character[0]->name = 'Miss Coder';
//Pour tous les personnages, afficher leur nom de $character suivi de played by et enfin la balise actor de $character qui correspond
foreach ($objetXML->xpath('//character') as $character) {
echo $character->name, ' played by ', $character->actor, '<br />';
Gabriel PEYROT SRC2
}
// - - - - - - - - - - - Exemple 7: Ajout d'éléments et d'attributs
echo '<h3>Exemple 7: Attribuer des valeurs</h2>';
//Ajout d'un personnage
$character = $objetXML->movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');
//Remplacement de l'intérieur de la balise rating par PG
$rating = $objetXML->movie[0]->addChild('rating', 'PG');
//Ajout des attributs type et mpaa
$rating->addAttribute('type', 'mpaa');
//Pour tous les personnages, afficher leur nom de $character suivi de played by et enfin la balise actor de $character qui correspond
foreach ($objetXML->xpath('//character') as $character) {
echo $character->name, ' played by ', $character->actor, '<br />';
}
echo $rating;
// - - - - - - - - - - - Exemple 8: Interopérabilité DOM
echo '<h3>Exemple 8: Interopérabilité DOM</h2>';
//Changer un élément DOM en SimpleXML
//Creation d'un nouveau document dom
$dom = new domDocument;
//Chargement en XML des balises suivantes
$dom->loadXML('<books><book><title>blah</title></book></books>');
//Message d'erreur si le parse rate
if (!$dom) {
echo 'Error while parsing the document';
exit;
}
//Importation de ce dom dans une nouvelle variable
$s = simplexml_import_dom($dom);
Gabriel PEYROT SRC2
//Affichage du contenu de title dans <book>
echo $s->book[0]->title;
?>
Gabriel PEYROT SRC2