• Save
Parsing et génération du XML en PHP
Upcoming SlideShare
Loading in...5
×
 

Parsing et génération du XML en PHP

on

  • 194 views

Comment faire l'analyse syntaxique (parsing) d'un fichier XML en langage PHP

Comment faire l'analyse syntaxique (parsing) d'un fichier XML en langage PHP

Statistics

Views

Total Views
194
Views on SlideShare
185
Embed Views
9

Actions

Likes
1
Downloads
0
Comments
0

1 Embed 9

http://www.slideee.com 9

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Parsing et génération du XML en PHP Parsing et génération du XML en PHP Presentation Transcript

  • PHP & XML Analyse syntaxique - Parsing : DOM, SAX, PULL
  • SimpleXML • Création d’un simpleXmlElement à partir d’une chaine – $x = new SimpleXMLElement($chaineXml); • Ou charger fichier xml – $x = simplexml_load_file("test.xml"); • Enregistrer un fichier xml – $x->asXML("test.xml"); • Accéder aux éléments et aux attributs – $x->book->title; $x->book["d"]; • Parcourir les éléments – foreach($x as $book) echo $book->title;
  • SimpleXML (aller plus loin) • Accéder aux éléments inconnus : – $x->children() • Utiliser xpath – $movies->xpath('//character') • Résoudre les espaces de nom – $ns = $languages->getNamespaces(true); – $dc = $lang->children($ns["dc"]); • Conversion au DOM – $element = dom_import_simplexml($child);
  • DOM • DomNode • DomDocument • DomElement • DomAttr • DomNodeList
  • DOM • Créer un domdocument – $xmlDoc = new DOMDocument(); • Charger chaine/fichier xml – $dom->loadXML($chaineXML); – $xmlDoc->load("biblio.xml"); • Enregistrer fichier xml – print $xmlDoc->save('nouveauFichier.xml'); • Récupérer les éléments : – $x = $xmlDoc->documentElement; //récupère l’élément racine foreach ($x->childNodes AS $item) … • Récupérer les éléments par leurs noms – $books = $xmlDoc->getElementsByTagName( "book" ); foreach( $books as $book ) …
  • DOM • Liste de nœud – $liste->length – $liste->item(indice) • Récupérer un élément par son id (si validé avec une DTD): – $elem = $doc->getElementById("cible") • Valeur et nom d’un élément – $item->nodeValue // le texte contenue dans tout les sous elements – $item->nodeName // vaut #text pour un nœud de type texte • Récupérer un attribut : – $produit->hasAttribute("categorie") – $produit->getAttribute("categorie ")
  • DOM navigation
  • DOM création • Créer un nœud – $dom->createElement("balise") • Créer un nœud texte – $dom->createTextNode("contenue"); • Ajouter/modifier et supprimer un attribut – $element->setAttribute("attribut", "valeur"); – $element->removeAttribute(‘attribut') • Ajouter un élément – $noeud->appendChild($nouveauNoeud); – $racine>insertBefore($nouveauNoeud, $noeud); • Supprimer un nœud – $noeud->removeChild($noeudASupprimer);
  • DOM (aller plus loin) • Requete xpath – $xpath = new DomXpath($document) ; – $result = $xpath->query( "/html/body//form[action='post']" ) ; – $result = $xpath->query($requete, $reference) ;
  • SAX • Parseur événementiel (push Parser) • Définir un handler (fonction) pour chaque événement : – Ouverture de balise – Fermeture de balise – Contenu texte – … • Les hundlers sont exécuté des que le parseur rencontre un événement correspondant
  • class affiche_titre { private $chemin ; // Affiche le contenu si la balise est rss/channel/title public function noeudTexte( $sax, $texte ) { $texte = trim($texte) ; // si ce n’est pas un titre, on n’affiche rien if ($this->chemin != '/rss/channel/title') return ; // sinon, on affiche son contenu echo utf8_decode( $texte ) ; } // balise ouvrante public function baliseOuvrante( $sax, $nom, $attributs ) { $this->chemin .= "/$nom" ; } // Balise fermante public function baliseFermante( $sax, $nom ) { $longueur = strlen($nom) + 1 ; $this->chemin = substr( $this->chemin, 0, - $longueur ) ; } } SAX
  • $sax = xml_parser_create('UTF-8') ; $xml = new affiche_titre(); xml_set_object($sax, $xml) ; xml_parser_set_option($sax, XML_OPTION_CASE_FOLDING, FALSE) ; xml_set_character_data_handler($sax, 'noeudTexte') ; xml_set_element_handler($sax, 'baliseOuvrante', 'baliseFermante'); // On charge le fichier rss $fichier_rss = file_get_contents('fichier.rss'); // On exécute l’ensemble xml_parse($sax,$fichier_rss, TRUE); SAX
  • SAX • Attribuer un hundler par défaut function defaut($sax, $donnee) { echo $donnee ; } xml_set_default_handler($sax, 'defaut') ;
  • SAX • Alimenter le parseur au fur et à mesure de la lecture du fichier xml_parse(). prend en premier paramètre la ressource identifiant le moteur, en deuxième une chaîne de caractères représentant du XML, et en dernier un booléen qui décrit si l’envoi du source XML est fini ou pas $fp = fopen($fichier , 'r') ; while ($xml = fread($fp, 1024) { xml_parse($sax , $xml, feof($fp)) ; } //libérer la memoire xml_parser_free($sax) ;
  • XMLReader • Pull Parser • Contrôle du flux de la lecture • Réaction aux événements rencontrés par le parseur
  • XMLReader • Créer le parseur – $reader = new XMLReader(); • Charger chaine xml ou fichier – $reader->XML($request); – $reader->open('http://www.cafeaulait.org/today.atom'); • Lire le flux – while ($reader->read()) { // processing code goes here... } • Récupérer le nom le type et la valeur de l’element courant: – $reader->name | $reader->nodeType | $reader->value • Fermer le flux – $reader->close();
  • XMLReader • Les type d’éléments : – XMLReader::ELEMENT – XMLReader::END_ELEMENT – XMLReader::TEXT – XMLReader::CDATA – XMLReader::WHITESPACE – XMLReader::SIGNIFICANT_WHITESPACE
  • PHP & XML Générer du XML : Concaténation, SimpleXML, DOM, XMLWriter
  • Générer du XML (php) (le résultat ) <sports> <basketball> <greatest_players> <player team="bulls" championships="6"> Michael Jordan </player> <player team="celtics" championships="11"> Bill Russell </player> </greatest_players> </basketball> </sports>
  • Générer du XML (php) (le concaténant)<?php $xmlBlock ="<?xml version="1.0" encoding="utf-8"?>"; $xmlBlock .= "<sports>"; $xmlBlock .= "<basketball>"; $xmlBlock .= "<greatest_players>"; $xmlBlock .= "<player team="bulls" championships="6">"; $xmlBlock .= "Michael Jordan"; $xmlBlock .= "</player>"; $xmlBlock .= "<player team="celtics" championships="11">"; $xmlBlock .= "Bill Russell"; $xmlBlock .= "</player>"; $xmlBlock .= "</greatest_players>"; $xmlBlock .= "</basketball>"; $xmlBlock .="</sports>"; header ("Content-Type: text/xml"); echo $xmlBlock; ?>
  • Générer du XML (php) (le simple) <?php $xml = new SimpleXMLElement( '<?xml version="1.0" encoding="UTF-8"?>'.'<sports></sports>'); $basketball = $xml->addChild('basketball'); $greatest = $basketball->addChild('greatest_players'); $jordan = $greatest->addChild('player','Michael Jordan'); $jordan->addAttribute('team','bulls'); $jordan->addAttribute('championships','6'); $russell = $greatest->addChild('player','Bill Russell'); $russell->addAttribute('team','celtics'); $russell->addAttribute('championships','11'); header('Content-Type: text/xml'); echo $xml->asXML(); ?>
  • Générer du XML (php) (le DOM) $xml = new DOMDocument('1.0','UTF-8'); $root = $xml->createElement('sports'); $basketball = $xml->createElement('basketball'); $greatest = $xml->createElement('greatest_players'); $jordan = $xml->createElement('player','Michael Jordan'); $team = $xml->createAttribute('team'); $team->value = 'bulls'; $rings = $xml->createAttribute('championships'); $rings->value = '6'; $jordan->appendChild($team); $jordan->appendChild($rings); $greatest->appendChild($jordan); $basketball->appendChild($greatest); $root->appendChild($basketball); $xml->appendChild($root); Header('Content-type: text/xml'); echo $xml->saveXML(); $russell = $xml->createElement('player','Bill Russell'); $team = $xml->createAttribute('team'); $team->value = 'celtics'; $rings = $xml- >createAttribute('championships'); $rings->value = '11'; $russell->appendChild($team); $russell->appendChild($rings); $greatest->appendChild($russell);
  • Générer du XML (php) (le Writer) $writer = new XMLWriter(); $writer->openMemory(); $writer->setIndent(4); $writer->startDocument(“1.0″, “UTF-8″); $writer->startElement("sports "); $writer->startElement("basketball"); $writer->startElement("greatest_players"); $writer-> startElement('player‘); $writer->text(‘Michael Jordan’); $writer->writeAttribute ('team‘,’ 'bulls’); $writer->writeAttribute ('championships‘,’ 6’); $writer->endElement(); //fin de player Jordan //… $writer->endElement(); // fin 'greatest_players $writer->endElement(); // fin basketball $writer->endElement(); // fin sports $writer->endDocument(); Header('Content-type: text/xml'); echo $writer->outputMemory();