&reftitle.examples;
Utilisation de base SimpleXML Plusieurs exemples de ce chapitre requièrent une chaîne XML. Plutôt que de la répéter à chaque exemple, nous allons la placer dans un fichier que nous inclurons dans chacun d'entre eux. Le contenu de ce fichier est illustré par l'exemple qui suit. Autrement, il est possible de créer un document XML et le lire avec simplexml_load_file. Exemple de fichier inclus examples/simplexml-data.php avec une chaîne XML PHP: Behind the Parser Ms. Coder Onlivia Actora Mr. Coder El ActÓr 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. PHP solves all my web problems 7 5 XML; ?> ]]> La simplicité de SimpleXML apparaît plus clairement lorsqu'on essaye d'extraire une chaîne ou un nombre d'un document XML basique. Lecture de <literal><plot></literal> movie[0]->plot; ?> ]]> &example.outputs; L'accès aux éléments d'un document XML qui contient des caractères non permis par rapport à la convention de nommage de PHP (e.g. les mots clés) est possible en encapsulant le nom de l'élément entre crochets et apostrophes. Récupération de <literal><line></literal> movie->{'great-lines'}->line; ?> ]]> &example.outputs; Accéder à un élément non-unique avec SimpleXML Lorsque plusieurs instances d'un élément existent en tant que fils d'un élément père unique, les techniques normales d'itération peuvent être appliquées. , nous affichons un . */ foreach ($movies->movie->characters->character as $character) { echo $character->name, ' played by ', $character->actor, PHP_EOL; } ?> ]]> &example.outputs; Les propriétés ($movies->movie dans notre précédent exemple) ne sont pas des tableaux. Ce sont des objets itérables et accessibles. Utilisation des attributs Jusque là, nous n'avons couvert que la lecture des noms d'éléments et leurs valeurs. SimpleXML peut aussi atteindre leurs attributs. L'accès aux attributs d'un élément se fait de la même façon que l'accès aux éléments d'un tableau. du premier . * Affichage des attributs de également. */ foreach ($movies->movie[0]->rating as $rating) { switch((string) $rating['type']) { // Récupération des attributs comme indices d'éléments case 'thumbs': echo $rating, ' thumbs up'; break; case 'stars': echo $rating, ' stars'; break; } } ?> ]]> &example.outputs; Comparaison des éléments et des attributs avec du texte Pour comparer un élément ou un attribut avec une chaîne de caractères ou pour le passer à une fonction qui nécessite une chaîne de caractères, il faut le transtyper en une chaîne en utilisant (string). Sinon, PHP traitera l'élément comme un objet. movie->title == 'PHP: Behind the Parser') { print 'My favorite movie.'; } echo htmlentities((string) $movies->movie->title); ?> ]]> &example.outputs; Comparaison de 2 éléments Deux objets SimpleXMLElement sont considérés comme différents même s'ils pointent vers le même élément. ]]> &example.outputs; Utilisation de XPath SimpleXML inclut le support embarqué de XPath. Pour trouver tous les éléments <character>. '//' sert de joker. Pour spécifier un chemin absolu, enlevez un slash. xpath('//character') as $character) { echo $character->name, ' played by ', $character->actor, PHP_EOL; } ?> ]]> &example.outputs; Attribuer des valeurs Les données dans SimpleXML n'ont pas à être constantes. L'objet permet la manipulation de tous ces éléments. movie[0]->characters->character[0]->name = 'Miss Coder'; echo $movies->asXML(); ?> ]]> &example.outputs; PHP: Behind the Parser Miss Coder Onlivia Actora Mr. Coder El ActÓr 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. PHP solves all my web problems 7 5 ]]> Ajout d'éléments et d'attributs SimpleXML est capable d'ajouter facilement des enfants et des attributs. movie[0]->characters->addChild('character'); $character->addChild('name', 'Mr. Parser'); $character->addChild('actor', 'John Doe'); $rating = $movies->movie[0]->addChild('rating', 'PG'); $rating->addAttribute('type', 'mpaa'); echo $movies->asXML(); ?> ]]> &example.outputs; PHP: Behind the Parser Ms. Coder Onlivia Actora Mr. Coder El ActÓr Mr. ParserJohn Doe 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. PHP solves all my web problems 7 5 PG ]]> Interopérabilité DOM PHP possède un mécanisme pour convertir les nœuds XML entre les formats SimpleXML et DOM. Cet exemple montre comment changer un élément DOM en SimpleXML. loadXML('blah'); if (!$dom) { echo 'Erreur lors de l\'analyse du document'; exit; } $books = simplexml_import_dom($dom); echo $books->book[0]->title; ?> ]]> &example.outputs; Utilisation des espaces de noms Onlivia Actora XML; $movies = simplexml_load_string($data); // L’espace de noms http://www.w3.org/XML/1998/namespace est disponible sous le nom "xml". echo $movies->movie->attributes("xml", true)["id"] . "\n"; // Les attributs avec espace de noms peuvent être récupérés avec attributes(). echo $movies->movie->attributes("a", true)["link"] . "\n"; // L’utilisation de l’URI de l’espace de noms permet d’utiliser n’importe quel alias dans le document. echo $movies->movie->attributes("http://a")["link"] . "\n"; // Les enfants peuvent être récupérés avec children(). echo $movies->movie->children("http://a")->actor . "\n"; // L’utilisation de xpath() avec un espace de noms nécessite d’enregistrer ce dernier d’abord. $movies->registerXPathNamespace("a", "http://a"); echo count($movies->xpath("//a:actor")) . "\n"; // Même l’espace de noms par défaut doit être enregistré. $movies->registerXPathNamespace("default", "http://default"); echo count($movies->xpath("//default:movie")) . "\n"; // Ceci est vide. echo count($movies->xpath("//movie")) . "\n"; ?> ]]>
Traitement des erreurs XML Le traitement des erreurs XML lors du chargement d'un document est une tâche simple. En utilisant les fonctionnalités libxml, il est possible de supprimer toutes les erreurs XML lors du chargement d'un document, puis, de les parcourir. L'objet LibXMLError, retourné par la fonction libxml_get_errors, contient plusieurs propriétés dont le message, la ligne et la colonne (position) de l'erreur. Chargement de chaînes XML cassées "); if ($sxe === false) { echo "Erreur lors du chargement du XML\n"; foreach(libxml_get_errors() as $error) { echo "\t", $error->message; } } ?> ]]> &example.outputs; ' expected Opening and ending tag mismatch: xml line 1 and broken Premature end of data in tag broken line 1 ]]>
&reftitle.seealso; libxml_use_internal_errors libxml_get_errors