&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 XMLPHP: Behind the ParserMs. CoderOnlivia ActoraMr. CoderEl 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 problems75
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 <plot>
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 <line>
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 ParserMiss CoderOnlivia ActoraMr. CoderEl 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 problems75
]]>
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 ParserMs. CoderOnlivia ActoraMr. CoderEl ActÓrMr. 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 problems75PG
]]>
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 nomsOnlivia 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_errorslibxml_get_errors