Outils pour utilisateurs

Outils du site


code_language:xml

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
code_language:xml [2025/12/19 07:09]
216.73.216.214 ancienne révision (2025/11/01 01:04) restaurée
code_language:xml [2025/12/19 11:54] (Version actuelle)
216.73.216.214 ancienne révision (2025/12/19 07:10) restaurée
Ligne 1: Ligne 1:
-====== XML ======+====== XML(Extensible Markup Language) ======
  
 ===== Éléments d'un document XML ===== ===== Éléments d'un document XML =====
Ligne 7: Ligne 7:
  
 Il existe différentes sortes de balises : Il existe différentes sortes de balises :
-  * Les balises ouvrantes <code>&lt;item&gt;</code> +  * Les balises ouvrantes <code><item></code> 
-  * Les balises fermantes <code>&lt;/item&gt;</code> +  * Les balises fermantes <code></item></code> 
-  * Les balises vides <code>&lt;nop/&gt;</code> +  * Les balises vides <code><nop/></code> 
-  * Les instructions de traitement <code>&lt;?xml-stylesheet ... ?&gt;</code> +  * Les instructions de traitement <code><?xml-stylesheet ... ?></code> 
-  * Les commentaires <code>&lt;!-- J'explique --&gt;</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 ====
Ligne 168: Ligne 168:
 </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>
 +
  
code_language/xml.1766128142.txt.gz · Dernière modification: 2025/12/19 07:09 de 216.73.216.214