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();
    }

   
?>