DUCLAUX Jean-Jacques
Exercice Staf2x
PHP avec XML,XSL et DOM+génération d'un fichier FOAF
1-Parser
avec le dom un fichier xml
Ce type de parsing est différent du parsing basé sur les
événements,
c'est un parsing basé sur l'arbre xml, aussi appellé
"tree-based parsing"
celà permet de parser le fichier xml. Celà peret de se
ballader dans l'arbre xml
en fonction d'éléments qui correspondent à un
critère précis.
L'utilisation du DOM est appréciée dans le sens ou le DOM
est INDEpendant d'une plateforme
ou d'un langage donné pour spécifier la structure et le
contenu du document.
De plus, de nombreux langages implémentent le DOM de
manière similaire ce qui simplifie la portabilité
de la logique et des instructions assez rapide
URL:
http://tecfa.unige.ch/staf/staf-i/duclaux/staf2x/ex3/domparser.php
code:
//ouverture du fichier xml
$dom = domxml_open_file('spectacles.xml');
//attribution de l'élément racine à la variable
$root
$root = $dom->document_element( );
$node1 = $dom->get_elements_by_tagname("lieu");
//cette fonction permet de parser le document xml
function process_node($node)
{
//test pour voir la profondeur le l'arbre
if ($node->has_child_nodes( ))
{
//parcours du tableau en fonction
du nombre de noeuds enfants
foreach($node->child_nodes( )
as $n) {
process_node($n);
}
}
// process leaves
if ($node->node_type( ) == XML_TEXT_NODE)
{
$content = rtrim($node->node_value( ));
if (!empty($content))
{
print "$content\n <br />";
}
}
}
2-Générer
du XML avec php:
Exemple 1
url:http://tecfa.unige.ch/staf/staf-i/duclaux/staf2x/ex3/xmlgenerator.php
code :
<?php
/*DUCLAUX Jean-Jacques June 2004 - Geneva
exemple basé sur un tutoriel trouvé dans le php cookbook
*/
//cefichier permet de générer du xml
//le xml décrit des spectacles
//les spectacles sont caractérisés par le lieu,
début et temps
//définition du header pour déclarer le mime type et que
le fichier soit reconnu comme du xml
header('Content-Type: text/xml');
print '<?xml version="1.0"?>' . "\n";
//lien vers le fichier xsl pour la mise en page
print '<?xml-stylesheet type="text/xsl" href="template.xsl"?>';
//définition de l'élément racine du fichier xml
print "<spectacles>\n";
//attribution d'éléments secondaires au noeud principal
//les variables sont stoquées dans un tableau
$spectacles = array(array('name' => 'spectacle1',
'lieu' => 'lieu1',
'start' => '8:00 PM',
'duree' => '30'),
//attribution d'éléments secondaires au noeud principal
//les variables sont stoquées dans un tableau
array('name' => 'spectacle2',
'lieu' => 'lieu2',
'start' => '8:00 PM',
'duree' => '60'));
//impression des variables afin de générer l'xml vu par
le client
foreach ($spectacles as $spectacle) {
print " <spectacle>\n";
foreach($spectacle as $tag => $data) {
print " <$tag>" . htmlspecialchars($data) .
"</$tag>\n";
}
print " </spectacle>\n";
}
//fermeture du noeud principal
print "</spectacles>\n";
/*cette façon de générer du xml n'est pas
très efficiente dans le sens ou elle utilise des boucles
ainsi que la fonction print, il serait certainement plus efficace
d'utiliser le DOM pour générer
les fichiers XML*/
?>
process_node($root);
Exemple 2
url:http://tecfa.unige.ch/staf/staf-i/duclaux/staf2x/ex3/xmlgenerator2.php
code:
<?PHP
/*DUCLAUX Jean-Jacques June 2004 - Geneva
exemple basé sur un tutoriel trouvé dans le php cookbook
*/
/* ce code permet de générer du xml à partir des
extensions XML et DOM de php
*/
// Création d'un nouveau document
$dom = domxml_new_doc('1.0');
//lien vers le template xsl pour la mise en page
print '<?xml-stylesheet type="text/xsl" href="template.xsl"?>';
//Création du noeud racine et fait un ajout du noeud principal
dans le document
$spectacle =
$dom->append_child($dom->create_element('spectacle'));
//créé le titre et l'ajoute à spectacle
$titre = $spectacle->append_child($dom->create_element('titre'));
//définit le texte et l'attribut pour le titre
$titre->append_child($dom->create_text_node('spectacle1'));
$titre->set_attribute('musique', 'acousmatique');
// créé et ajoute l'élément lieu à
la variable àspectacle
$lieu = $spectacle->append_child($dom->create_element('lieu'));
// create and append the text for each element
$lieu->append_child($dom->create_text_node('lieu 1'));
//idem pour le lieu2
$lieu2 = $spectacle->append_child($dom->create_element('temps'));
$lieu2->append_child($dom->create_text_node('50 minutes'));
/*imprime une version bien formattée du document DOM en xml
le doc est bien formaté car la fonction dump_mem a l'attribut
true
si l'argument était sur FALSE le code serait imprimé
comme une string
*/
echo $dom->dump_mem(true);
/*à présent que le document est
généré il serait souhaitable de le parser*/
?>
Feuille de
style XSL
code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<html>
<body>
<h2>Liste des spectacles</h2>
<table border="0">
<tr bgcolor="#9acd32">
<th
align="left">spectacle</th>
<th
align="left">lieu</th>
<th
align="left">start</th>
<th
align="left">durée</th>
</tr>
<xsl:for-each
select="spectacles/spectacle">
<tr>
<td><xsl:value-of
select="name"/></td>
<td><xsl:value-of
select="lieu"/></td>
<td><xsl:value-of
select="start"/></td>
<td><xsl:value-of
select="duree"/></td>
</tr>
</xsl:for-each>
</table>
<br/>
<br/>
<br/>
<br/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
3-Dispositif
permettant de générer un fichier FOAF avec php
url:http://tecfa.unige.ch/staf/staf-i/duclaux/staf2x/ex3/formfoaf.php
code du formulaire:
<html>
<head>
<link rel="stylesheet" type="text/css"
href="http://tecfa.unige.ch/staf/staf-i/duclaux/staf2x/stylesheets/defautjjstyle.css""
/>
</head>
<body>
<form method="post" action="example3.php">
<IMG src="foafbannerJJ.jpg" align ="top">
<p>This form allows you to create a foaf file.
<br />DUCLAUX Jean-Jacques <br /> Geneva, July
2004</p>
<p>name</p> <input type="text" name="name"
size="30">
<p>title</p> <input type="text" name="title"
size="30">
<p>prenom</p> <input type="text" name="prenom"
size="30">
<p>surnom</p> <input type="text" name="surnom"
size="30">
<p>mail</p> <input type="text" name="mail" size="30">
<p>homepage</p> <input type="text" name="homepage"
size="30">
<p>blog</p> <input type="text" name="blog" size="30">
<p>image</p> <input type="text" name="image"
size="30">
<p>AddDocument</p> <br />
<p>you need to specify the document URI, document title and
document description:</p>
<input type="text" name="document_uri" size="30" >
<input type="text" name="document_title" size="30">
<input type="text" name="document_description" size="30">
<p>phone</p> <input type="text" name="phone"
size="30">
<p>jabberId</p> <input type="text" name="jabberId"
size="30">
<p>theme</p> <input type="text" name="theme"
size="30">
<p>workPlacePage</p> <input type="text"
name="workPlacePage" size="30">
<p>schoolPage</p> <input type="text" name="schoolPage"
size="30">
<p>interest</p> <input type="text" name="interest"
size="30">
<p>fundedBy</p> <input type="text" name="fundedBy"
size="30">
<p>logo</p> <input type="text" name="logo" size="30">
<p>lat</p> <input type="text" name="lat" size="30">
<p>long</p> <input type="text" name="long" size="30">
<p>depiction</p> <input type="text" name="depiction"
size="30">
<br /> <p>Add someone you know :</p>
<p>name</p> <input type="text" name="k1name"
size="30">
<p>nickname</p> <input type="text" name="k1nickname"
size="30">
<p>seeAlso</p> <input type="text" name="k1seeAlso"
size="30">
<input type="submit" value="OK">
</form></body></html>
Code qui traite les informations passées par le formulaire
permettant la génération du code FOAF (valide selon le
validateur du consortium):
(Utilisation
des librairies PEAR)
<?php
//attribution du chemin d'include
set_include_path("/data2/web/staf/staf-i/duclaux/staf2x/ex3/PEAR/");
require_once 'XML/FOAF.php';
//variables passées par le formulaire
//main foaf
$name = $_POST['name'];
$title = $_POST['title'];
$prenom = $_POST['prenom'];
$surnom = $_POST['surnom'];
$mail = 'mailto:'.$_POST['mail'];
$homepage = $_POST['homepage'];
$blog = $_POST['blog'];
$image = $_POST['image'];
$document_uri = $_POST['document_uri'];
$document_title = $_POST['document_title'];
$document_description = $_POST['document_description'];
$phone = $_POST['phone'];
$jabberId = $_POST['jabberId'];
$theme = $_POST['theme'];
$workPlacePage = $_POST['workPlacePage'];
$schoolPage = $_POST['schoolPage'];
$fundedBy = $_POST['fundedBy'];
$logo = $_POST['logo'];
$lat = $_POST['lat'];
$long = $_POST['long'];
$depiction = $_POST['depiction'];
//variables passées par le formulaire
//partie know
$k1name =$_POST['k1name'];
$k1nick =$_POST['k1nickname'];
$k1mail = 'mailto:'.$_POST['mail'];
$k1seeAlso =$_POST['k1seeAlso'];
$k1jabberId =$_POST['k1jabberId'];
// Main FOAF
$foaf = new XML_FOAF();
$foaf->newAgent('person');
$foaf->setName($name);
$foaf->setTitle($title);
$foaf->setFirstName($prenom);
$foaf->setSurname($surnom);
$foaf->addMbox($mail,TRUE); // see also:
XML_FOAF::setMboxSha1Sum();
$foaf->addHomepage($homepage);
$foaf->addWeblog($blog);
$foaf->addImg($image);
$foaf->addPage($document_uri,$document_title,$document_description);
$foaf->addPhone($phone);
$foaf->addJabberID($jabberId);
$foaf->addTheme($theme);
$foaf->addWorkplaceHomepage($workPlacePage);
$foaf->addSchoolHomepage($schoolPage);
$foaf->addInterest($interest);
$foaf->addFundedBy($fundedBy);
$foaf->addLogo($logo);
$foaf->setBasedNear($lat,$long);
$foaf->addDepiction($depiction);
//$foaf->addDepiction('http://example.org/depiction/2');
// Content of a <foaf:knows><foaf:Person
/></foaf:knows>
$know1 = new XML_FOAF();
$know1->newAgent('person');
$know1->setName($k1name);
$know1->addNick($k1nick);
$know1->addMboxSha1Sum($k1mail,TRUE);
$know1->addSeeAlso($k1seeAlso);
$know1->addJabberID($k1jabberId);
// Add to Main FOAF
$foaf->addKnows($know1);
if (!isset($_GET['xml'])) {
echo "<pre>"
.htmlentities($foaf->get()). "</pre>";
echo "<hr />";
//show_source(__FILE__);
} else {
header('Content-Type: text/xml');
$foaf->dump();
}
?>