| Les deux révisions précédentes
Révision précédente
|
|
code_language:xml [2026/03/24 07:01] 216.73.216.222 ancienne révision (2025/12/19 07:09) restaurée |
code_language:xml [2026/03/24 07:06] (Version actuelle) 216.73.216.222 ancienne révision (2025/12/19 07:10) restaurée |
| ====== XML ====== | ====== XML(Extensible Markup Language) ====== |
| |
| ===== Éléments d'un document XML ===== | ===== Éléments d'un document XML ===== |
| |
| Il existe différentes sortes de balises : | Il existe différentes sortes de balises : |
| * Les balises ouvrantes <code><item></code> | * Les balises ouvrantes <code><item></code> |
| * Les balises fermantes <code></item></code> | * Les balises fermantes <code></item></code> |
| * Les balises vides <code><nop/></code> | * Les balises vides <code><nop/></code> |
| * Les instructions de traitement <code><?xml-stylesheet ... ?></code> | * Les instructions de traitement <code><?xml-stylesheet ... ?></code> |
| * Les commentaires <code><!-- J'explique --></code> | * Les commentaires <code><!-- J'explique --></code> |
| * Les sections CDATA ({{lang|en|Character DATA}}) <code><![CDATA[ Contenu de la section ]]></code> | * Les sections CDATA (Character DATA) <code><![CDATA[ Contenu de la section ]]></code> |
| |
| ==== Conventions de nommage des balises ==== | ==== Conventions de nommage des balises ==== |
| </root> | </root> |
| </code> | </code> |
| | |
| | ===== Espace de nom ===== |
| | |
| | == Syntaxe == |
| | L'exemple ci-dessous contient deux déclarations, la première par défaut et la seconde associant le préfixe « ip » à l'URI des adresses IP, pour les distinguer des adresses postales : |
| | <code Xml [enable_line_numbers="true"]> |
| | <adresse |
| | xmlns="http://www.example.com/adresses_postales" |
| | xmlns:ip="http://www.example.com/adresses_ip"> |
| | </code> |
| | |
| | ===== Attribut balise xml ===== |
| | |
| | ^ Attribut ^ Description ^ Exemple ^ |
| | | xml:lang | décrit la langue du contenue de l'élément, sur deux ou trois lettres | <code Xml [enable_line_numbers="true"]> <p xml:lang="fr">Bonjour</p> </code> | |
| | | xml:space | permet de faire respecter à une application le traitement des caractères d'espacement; deux valeurs possible: default ou preserve | <code Xml [enable_line_numbers="true"]> <p xml:space="default"> titre1</p> <!--L'application traitera les espaces selon ses propres règles --></code> <code Xml [enable_line_numbers="true"]><p xml:space="preserve">titre2 </p><!--L'application devra respecter les espaces contenue dans le titre2 à la lettre --></code> | |
| | | xml:base | Permet de spécifié l'URI (URL+URN) d'un élément | <code Xml [enable_line_numbers="true"]><?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> |
| | <book xml:base="http://www.somewhere.org/Teaching/index.html"> |
| | <chapter xml:base="XML/chapter.html"> |
| | <section xml:base="XPath/section.html"/> |
| | <section xml:base="/Course/section.html"/> |
| | <section xml:base="http://www.elsewhere.org/section.html"/> |
| | </chapter> |
| | </book></code> | |
| | | xml:id | Permet d'attribuer un identificateur à tout élément | <code Xml [enable_line_numbers="true"]><personName xml:id="423"> </personName></code> | |
| | |
| | |
| | |
| | |
| | ===== Interprétation du XML ===== |
| | |
| | Il existe de nombreuses API permettant d'interpréter un document XML. La plupart sont conçues pour un langage particulier : |
| | |
| | * Dom4J (Java) |
| | * JDOM (Java) |
| | * SimpleXML (PHP) |
| | * PyXML (Python)[1] |
| | |
| | Tous ces interpréteurs peuvent être de deux types normalisés : |
| | |
| | * DOM (créé par le W3C) : un arbre de nœuds complet est construit à partir du document XML. |
| | * SAX (créé par David Megginson) : l'interpréteur appelle certaines fonctions de l'application en fonction de chacun des éléments de base rencontrés dans le document XML (ouvertures de balise, fermetures, données, commentaires, ...). |
| | |
| | ===== XPath ===== |
| | == Syntaxe == |
| | Le XPath est un langage de sélection de différents types d'objets XML, appelés « nœuds »http://www.w3schools.com/dom/dom_nodetype.asp. Un ensemble de nœuds est appelé « contexte ». |
| | |
| | Le XPath se présente sous la forme de chemins composés de http://www.w3schools.com/xpath/xpath_syntax.asp |
| | ^ Sélecteur ^ Notes ^ |
| | | nom du nœud | Sélectionne ce qui est compris dans le nœud nommé | |
| | | / | Sélectionne en partant du nœud racine (chemin absolu). | |
| | | / / | Sélectionne en partant du nœud courant, peu importe le reste de l'emplacement. | |
| | | . | Sélectionne à partir du nœud courant (chemin relatif). = <code Xml [enable_line_numbers="true"]>self::node()</code> | |
| | | .. | Sélectionne à partir du parent du nœud courant. = <code Xml [enable_line_numbers="true"]>parent::node()</code> | |
| | | @ | Sélectionne les attributs. = <code Xml [enable_line_numbers="true"]>attribute::</code> | |
| | | <nowiki>|</nowiki> | Opérateur de sélection multiple.| |
| | |
| | remarque|Il existe un interpréteur en ligne pour réaliser les exemples décrits ci-dessous : http://www.xpathtester.com/.<br/> La classe http://www.php.net/manual/fr/domxpath.query.php permet de les programmer. |
| | |
| | Ces expressions sont appelées « chemin de localisation », composés d'un ou plusieurs « pas de localisation » (ou « étapes ») séparés par des « / ». Les pas de localisation ont chacun trois composants : |
| | - Un axe (parent, descendant…). |
| | - Un test de nœud (nom ou fonction désignant les nœuds). |
| | - Des prédicats (entre crochets). |
| | |
| | == Axes == |
| | Pour décrire les relations entre les nœuds, XPath utilise le vocabulaire suivant : |
| | |
| | ^ Axe ^ Abréviation ^ Notes |
| | |<code>ancestor</code>| | ancêtre | |
| | |<code>ancestor-or-self</code>| | ancêtre ou soi | |
| | |<code>attribute</code> |<code>@</code> | attribut, <code>@abc</code> signifie <code>attribute::abc</code> | |
| | |<code>child</code>| | enfant, <code>xyz</code> signifie <code>child::xyz</code> | |
| | |<code>descendant</code>| | | |
| | |<code>descendant-or-self</code>|<code>//</code>|<code>//</code> signifie <code>/descendant-or-self::node()/</code> | |
| | |<code>following</code>| | | suivant| |
| | |<code>following-sibling</code>| | | frère suivant | |
| | |<code>namespace</code>| | | espace de noms | |
| | |<code>parent</code> | <code>..</code> |<code>..</code> signifie <code>parent::node()</code> | |
| | |<code>preceding</code>| | | précédent | |
| | |<code>preceding-sibling</code>| || | |
| | |<code>self</code>|<code>.</code>|soi, <code>.</code> signifie <code>self::node()</code> | |
| | |
| | == Tests de nœuds == |
| | Soit l'[[../Espace de nom/|espace de nom]] <code>ns</code> : |
| | * <code>//ns:*</code> sélectionne tout les éléments du namespace. |
| | * <code>//ns:nom</code> récupère tous les éléments du namespace nommés "nom". |
| | |
| | |
| | ^ Tests ^ Notes ^ |
| | | comment() | trouve tous les commentaires (ex : <code><!-- commentaire 1 --></code>)| |
| | | text() | trouve un nœud texte, (ex : <code>hello world</code> dans <code><k>hello<m> world</m></k></code>)| |
| | | processing-instruction() | trouve les instructions de traitement (ex : <code>//processing-instruction('php') trouve <?php echo $a; ?></code>)| |
| | | node() | trouve tous les nœuds.| |
| | |
| | == Prédicats == |
| | Les prédicats sont des fonctions filtrant les nœuds évalués à ''false'', qui se placent à la fin des sélections<ref>http://www.w3.org/TR/xpath#corelib</ref> : |
| | |
| | Par exemple, les quatre requêtes ci-dessous renvoie le même résultat (si la branche 2 est la dernière comme dans l'exemple en bas de cette page) : |
| | */ /branche[2] |
| | */ /branche[@nom="branche2"] |
| | */tronc/branche[last()] |
| | */tronc/branche[position()=2] |
| | |
| | ^ Prédicats ^ Notes ^ |
| | |
| | |<code>last()</code> | renvoie le dernier nœud de la sélection| |
| | |<code>position()</code> | renvoie le nœud situé à la position précisée| |
| | |<code>count(contexte)</code> | renvoie le nombre de nœuds en paramètre| |
| | |<code>starts-with(chaine1, sous-chaine2)</code> | renvoie ''true'' si le premier argument commence avec le second| |
| | |<code>contains(botte_de_foin, aiguille)</code> | renvoie ''true'' si le premier argument contient le second| |
| | |<code>sum(contexte)</code> | renvoie la somme des valeurs numériques des nœuds en paramètre| |
| | |<code>floor(nombre)</code> | renvoie le nombre arrondi à l'entier inférieur| |
| | |<code>ceiling(nombre)</code> | renvoie le nombre arrondi à l'entier supérieur| |
| | |<code>round(nombre)</code> | renvoie le nombre arrondi à l'entier le plus proche| |
| | |
| | == Exemples == |
| | Soit l'arborescence suivante : |
| | <code Xml [enable_line_numbers="true"]> |
| | <?xml version="1.0" encoding="UTF-8"?> |
| | <tronc nom="tronc1"> |
| | <!-- commentaire 1 --> |
| | <branche nom="branche1" epaisseur="gros"> |
| | <brindille nom="brindille1"> |
| | <!-- commentaire 2 --> |
| | <feuille nom="feuille1" couleur="marron" /> |
| | <feuille nom="feuille2" poids="50" /> |
| | <feuille nom="feuille3" /> |
| | </brindille> |
| | <brindille nom="brindille2"> |
| | <feuille nom="feuille4" poids="90" /> |
| | <feuille nom="feuille5" couleur="violet" /> |
| | </brindille> |
| | </branche> |
| | <branche nom="branche2"> |
| | <brindille nom="brindille3"> |
| | <feuille nom="feuille6" /> |
| | </brindille> |
| | <brindille nom="brindille4"> |
| | <feuille nom="feuille7" /> |
| | <feuille nom="feuille8" /> |
| | <feuille nom="feuille9" couleur="noir" /> |
| | <feuille nom="feuille10" poids="100" /> |
| | </brindille> |
| | </branche> |
| | <branche nom="branche3"> |
| | <brindille nom="brindille5"> |
| | </brindille> |
| | </branche> |
| | </tronc> |
| | </code> |
| | |
| | === Abréviations === |
| | - Sélection 1 : toutes les <feuille> d'une <brindille> contenue dans une <branche>, descendant du <tronc>, issu de la racine. |
| | - Abrégé : <code>/tronc/branche/brindille/feuille</code> |
| | - Non abrégé : <code>/child::tronc/child::branche/child::brindille/child::feuille</code> |
| | - Sélection 2 : la <branche> dont l'attribut "nom" est "branche3", enfant du <tronc>, inclue dans la racine. |
| | - Abrégé : <code>/tronc/branche[@nom='branche3']</code> |
| | - Non abrégé : <code>/child::tronc/child::branche[attribute::nom='branche3']</code> |
| | -Sélection 3 : toutes les brindilles ont au moins une feuille. |
| | - <code>//brindille[feuille]</code> |
| | - Sélection 4 : dernière branche du tronc. |
| | - <code>//tronc/branche[last()]</code> |
| | - Sélection 5 : tous les noms des brindilles qui n'ont pas de feuille. |
| | - <code>//brindille[not(feuille)]/@nom</code> |
| | |
| | === PHP === |
| | Créer le .php suivant à côté du tronc.xml publié ci-dessus. |
| | <code php [enable_line_numbers="true"]> |
| | <?php |
| | $file = 'tronc.xml'; |
| | $xpath = "/tronc/branche/brindille/feuille[last()]"; |
| | if(file_exists($file)) { |
| | $xml = simplexml_load_file($file); |
| | if($result = $xml->xpath($xpath)) { |
| | print 'Résultats :'; |
| | var_dump($result); |
| | } else { |
| | echo 'Syntaxe invalide.'; |
| | } |
| | } |
| | else |
| | exit("Le fichier $file n'existe pas."); |
| | ?> |
| | </code> |
| | |
| |