parsing et génération du xml en php
TRANSCRIPT
![Page 1: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/1.jpg)
PHP & XMLAnalyse syntaxique - Parsing : DOM, SAX, PULL
![Page 2: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/2.jpg)
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;
![Page 3: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/3.jpg)
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);
![Page 4: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/4.jpg)
DOM
• DomNode • DomDocument• DomElement• DomAttr• DomNodeList
![Page 5: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/5.jpg)
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 ) …
![Page 6: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/6.jpg)
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 ")
![Page 7: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/7.jpg)
DOM navigation
![Page 8: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/8.jpg)
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);
![Page 9: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/9.jpg)
DOM (aller plus loin)• Requete xpath
– $xpath = new DomXpath($document) ;– $result = $xpath->query( "/html/body//form[action='post']" ) ;– $result = $xpath->query($requete, $reference) ;
![Page 10: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/10.jpg)
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
![Page 11: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/11.jpg)
class affiche_titre {private $chemin ;// Affiche le contenu si la balise est rss/channel/titlepublic function noeudTexte( $sax, $texte ) {
$texte = trim($texte) ;// si ce n’est pas un titre, on n’affiche rienif ($this->chemin != '/rss/channel/title') return ;// sinon, on affiche son contenuecho utf8_decode( $texte ) ;
}// balise ouvrantepublic function baliseOuvrante( $sax, $nom, $attributs ) {
$this->chemin .= "/$nom" ;}// Balise fermantepublic function baliseFermante( $sax, $nom ) {
$longueur = strlen($nom) + 1 ;$this->chemin = substr( $this->chemin, 0, - $longueur ) ;
}}
SAX
![Page 12: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/12.jpg)
$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’ensemblexml_parse($sax,$fichier_rss, TRUE);
SAX
![Page 13: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/13.jpg)
SAX• Attribuer un hundler par défaut
function defaut($sax, $donnee) {echo $donnee ;
}xml_set_default_handler($sax, 'defaut') ;
![Page 14: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/14.jpg)
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 memoirexml_parser_free($sax) ;
![Page 15: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/15.jpg)
XMLReader
• Pull Parser• Contrôle du flux de la lecture• Réaction aux événements rencontrés par le
parseur
![Page 16: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/16.jpg)
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();
![Page 17: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/17.jpg)
XMLReader• Les type d’éléments :
– XMLReader::ELEMENT– XMLReader::END_ELEMENT– XMLReader::TEXT– XMLReader::CDATA– XMLReader::WHITESPACE– XMLReader::SIGNIFICANT_WHITESPACE
![Page 18: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/18.jpg)
PHP & XMLGénérer du XML : Concaténation, SimpleXML, DOM, XMLWriter
![Page 19: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/19.jpg)
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>
![Page 20: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/20.jpg)
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;
?>
![Page 21: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/21.jpg)
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(); ?>
![Page 22: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/22.jpg)
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);
![Page 23: Parsing et génération du XML en PHP](https://reader035.vdocuments.site/reader035/viewer/2022081520/588261681a28abd40e8b6d2b/html5/thumbnails/23.jpg)
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();