mirror of
https://github.com/php/doc-fr.git
synced 2026-03-24 15:12:13 +01:00
544 lines
14 KiB
XML
544 lines
14 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: bdc3ab31fb7db217fe9418230a11d9d779ee65eb Maintainer: yannick Status: ready -->
|
||
<!-- Reviewed: yes -->
|
||
|
||
<chapter xml:id="simplexml.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
&reftitle.examples;
|
||
<section xml:id="simplexml.examples-basic">
|
||
<title>Utilisation de base SimpleXML</title>
|
||
<para>
|
||
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 <function>simplexml_load_file</function>.
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Exemple de fichier inclus examples/simplexml-data.php avec une chaîne XML</title>
|
||
<programlisting role="php" xml:id="simplexml.examples.movie">
|
||
<![CDATA[
|
||
<?php
|
||
$xmlstr = <<<XML
|
||
<?xml version='1.0' standalone='yes'?>
|
||
<movies>
|
||
<movie>
|
||
<title>PHP: Behind the Parser</title>
|
||
<characters>
|
||
<character>
|
||
<name>Ms. Coder</name>
|
||
<actor>Onlivia Actora</actor>
|
||
</character>
|
||
<character>
|
||
<name>Mr. Coder</name>
|
||
<actor>El ActÓr</actor>
|
||
</character>
|
||
</characters>
|
||
<plot>
|
||
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.
|
||
</plot>
|
||
<great-lines>
|
||
<line>PHP solves all my web problems</line>
|
||
</great-lines>
|
||
<rating type="thumbs">7</rating>
|
||
<rating type="stars">5</rating>
|
||
</movie>
|
||
</movies>
|
||
XML;
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
La simplicité de SimpleXML apparaît plus clairement lorsqu'on essaye
|
||
d'extraire une chaîne ou un nombre d'un document XML basique.
|
||
<example>
|
||
<title>Lecture de <literal><plot></literal></title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
echo $movies->movie[0]->plot;
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
|
||
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.
|
||
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
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.
|
||
<example>
|
||
<title>Récupération de <literal><line></literal></title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
echo $movies->movie->{'great-lines'}->line;
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
PHP solves all my web problems
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Accéder à un élément non-unique avec SimpleXML</title>
|
||
<simpara>
|
||
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.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
/* Pour chaque <character>, nous affichons un <name>. */
|
||
foreach ($movies->movie->characters->character as $character) {
|
||
echo $character->name, ' played by ', $character->actor, PHP_EOL;
|
||
}
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
Ms. Coder played by Onlivia Actora
|
||
Mr. Coder played by El ActÓr
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<note>
|
||
<para>
|
||
Les propriétés (<literal>$movies->movie</literal> dans notre précédent exemple)
|
||
ne sont pas des tableaux. Ce sont des objets
|
||
<link linkend="class.iterator">itérables</link> et
|
||
<link linkend="class.arrayaccess">accessibles</link>.
|
||
</para>
|
||
</note>
|
||
<para>
|
||
<example>
|
||
<title>Utilisation des attributs</title>
|
||
<simpara>
|
||
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.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
/* Accès au node <rating> du premier <movie>.
|
||
* Affichage des attributs de <rating> é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;
|
||
}
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
7 thumbs up5 stars
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Comparaison des éléments et des attributs avec du texte</title>
|
||
<simpara>
|
||
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
|
||
<literal>(string)</literal>.
|
||
Sinon, PHP traitera l'élément comme un objet.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
if ((string) $movies->movie->title == 'PHP: Behind the Parser') {
|
||
print 'My favorite movie.';
|
||
}
|
||
|
||
echo htmlentities((string) $movies->movie->title);
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
My favorite movie.PHP: Behind the Parser
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Comparaison de 2 éléments</title>
|
||
<simpara>
|
||
Deux objets <classname>SimpleXMLElement</classname>
|
||
sont considérés comme différents même s'ils
|
||
pointent vers le même élément.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
|
||
$movies1 = new SimpleXMLElement($xmlstr);
|
||
$movies2 = new SimpleXMLElement($xmlstr);
|
||
var_dump($movies1 == $movies2);
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
bool(false)
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Utilisation de XPath</title>
|
||
<simpara>
|
||
SimpleXML inclut le support embarqué de <acronym>XPath</acronym>.
|
||
Pour trouver tous les éléments <literal><character></literal>.
|
||
</simpara>
|
||
<simpara>
|
||
'<literal>//</literal>' sert de joker. Pour spécifier un chemin absolu,
|
||
enlevez un slash.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
foreach ($movies->xpath('//character') as $character) {
|
||
echo $character->name, ' played by ', $character->actor, PHP_EOL;
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
Ms. Coder played by Onlivia Actora
|
||
Mr. Coder played by El ActÓr
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Attribuer des valeurs</title>
|
||
<simpara>
|
||
Les données dans SimpleXML n'ont pas à être constantes. L'objet permet
|
||
la manipulation de tous ces éléments.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
$movies->movie[0]->characters->character[0]->name = 'Miss Coder';
|
||
|
||
echo $movies->asXML();
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
<?xml version="1.0" standalone="yes"?>
|
||
<movies>
|
||
<movie>
|
||
<title>PHP: Behind the Parser</title>
|
||
<characters>
|
||
<character>
|
||
<name>Miss Coder</name>
|
||
<actor>Onlivia Actora</actor>
|
||
</character>
|
||
<character>
|
||
<name>Mr. Coder</name>
|
||
<actor>El ActÓr</actor>
|
||
</character>
|
||
</characters>
|
||
<plot>
|
||
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.
|
||
</plot>
|
||
<great-lines>
|
||
<line>PHP solves all my web problems</line>
|
||
</great-lines>
|
||
<rating type="thumbs">7</rating>
|
||
<rating type="stars">5</rating>
|
||
</movie>
|
||
</movies>
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Ajout d'éléments et d'attributs</title>
|
||
<simpara>
|
||
SimpleXML est capable d'ajouter facilement des
|
||
enfants et des attributs.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
include 'examples/simplexml-data.php';
|
||
$movies = new SimpleXMLElement($xmlstr);
|
||
|
||
$character = $movies->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();
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
<?xml version="1.0" standalone="yes"?>
|
||
<movies>
|
||
<movie>
|
||
<title>PHP: Behind the Parser</title>
|
||
<characters>
|
||
<character>
|
||
<name>Ms. Coder</name>
|
||
<actor>Onlivia Actora</actor>
|
||
</character>
|
||
<character>
|
||
<name>Mr. Coder</name>
|
||
<actor>El ActÓr</actor>
|
||
</character>
|
||
<character><name>Mr. Parser</name><actor>John Doe</actor></character></characters>
|
||
<plot>
|
||
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.
|
||
</plot>
|
||
<great-lines>
|
||
<line>PHP solves all my web problems</line>
|
||
</great-lines>
|
||
<rating type="thumbs">7</rating>
|
||
<rating type="stars">5</rating>
|
||
<rating type="mpaa">PG</rating></movie>
|
||
</movies>
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Interopérabilité DOM</title>
|
||
<simpara>
|
||
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.
|
||
</simpara>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
$dom = new DOMDocument;
|
||
$dom->loadXML('<books><book><title>blah</title></book></books>');
|
||
if (!$dom) {
|
||
echo 'Erreur lors de l\'analyse du document';
|
||
exit;
|
||
}
|
||
|
||
$books = simplexml_import_dom($dom);
|
||
|
||
echo $books->book[0]->title;
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
blah
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Utilisation des espaces de noms</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
$data = <<<XML
|
||
<movies xmlns="http://default" xmlns:a="http://a">
|
||
<movie xml:id="movie1" a:link="IMDB">
|
||
<a:actor>Onlivia Actora</a:actor>
|
||
</movie>
|
||
</movies>
|
||
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";
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</para>
|
||
</section>
|
||
|
||
<section xml:id="simplexml.examples-errors">
|
||
<title>Traitement des erreurs XML</title>
|
||
<para>
|
||
Le traitement des erreurs XML lors du chargement d'un document est
|
||
une tâche simple. En utilisant les fonctionnalités
|
||
<link linkend="book.libxml">libxml</link>, il est possible de supprimer
|
||
toutes les erreurs XML lors du chargement d'un document, puis, de les parcourir.
|
||
</para>
|
||
<para>
|
||
L'objet <classname>LibXMLError</classname>, retourné par la fonction
|
||
<function>libxml_get_errors</function>, contient plusieurs propriétés
|
||
dont le <link linkend="libxmlerror.props.message">message</link>,
|
||
la <link linkend="libxmlerror.props.line">ligne</link> et la
|
||
<link linkend="libxmlerror.props.column">colonne</link> (position) de l'erreur.
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Chargement de chaînes XML cassées</title>
|
||
<programlisting role="php" xml:id="simplexml.examples.error">
|
||
<![CDATA[
|
||
<?php
|
||
libxml_use_internal_errors(true);
|
||
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
|
||
if ($sxe === false) {
|
||
echo "Erreur lors du chargement du XML\n";
|
||
foreach(libxml_get_errors() as $error) {
|
||
echo "\t", $error->message;
|
||
}
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
Erreur lors du chargement du XML
|
||
Blank needed here
|
||
parsing XML declaration: '?>' expected
|
||
Opening and ending tag mismatch: xml line 1 and broken
|
||
Premature end of data in tag broken line 1
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<section role="seealso"><!-- {{{ -->
|
||
&reftitle.seealso;
|
||
<para>
|
||
<simplelist>
|
||
<member><function>libxml_use_internal_errors</function></member>
|
||
<member><function>libxml_get_errors</function></member>
|
||
<member><xref linkend="class.libxmlerror" /></member>
|
||
</simplelist>
|
||
</para>
|
||
</section>
|
||
</section>
|
||
|
||
</chapter>
|
||
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|