| Les deux révisions précédentes
Révision précédente
Prochaine révision
|
Révision précédente
|
code_language:xml [2025/11/01 01:04] 74.7.227.242 ancienne révision (2025/09/09 11:00) restaurée |
code_language:xml [2025/11/01 16:19] (Version actuelle) 74.7.227.242 ancienne révision (2025/09/09 10:50) restaurée |
| ====== XML(Extensible Markup Language) ====== | ====== XML ====== |
| |
| ===== É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 (Character DATA) <code><![CDATA[ Contenu de la section ]]></code> | * Les sections CDATA ({{lang|en|Character DATA}}) <code><![CDATA[ Contenu de la section ]]></code> |
| |
| ==== Conventions de nommage des balises ==== | ==== Conventions de nommage des balises ==== |
| </code> | </code> |
| |
| ===== Structure d'un document XML ===== | ==== Structure d'un document XML ==== |
| |
| |
| |
| Quand toutes ces règles sont respectées, on obtient un document XML « '''bien formé''' ». Dans ce cas, un navigateur comme Internet explorer ou Firefox peut l'ouvrir. Dans le cas contraire, le navigateur affiche un message d'erreur. | Quand toutes ces règles sont respectées, on obtient un document XML « '''bien formé''' ». Dans ce cas, un navigateur comme Internet explorer ou Firefox peut l'ouvrir. Dans le cas contraire, le navigateur affiche un message d'erreur. |
| |
| == Exemple de structure simple == | |
| <code Xml [enable_line_numbers="true"]> | |
| <?xml version="1.0" ?> | |
| <root> | |
| <items> | |
| <item no="1">Premier élément</item> | |
| <item no="2">Autre chose</item> | |
| <item no="3">Troisième élément</item> | |
| <item no="4">Quatrième élément</item> | |
| </items> | |
| </root> | |
| </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> | |
| |
| |