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
code_language:xml [2025/12/19 07:10]
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 ===== 
 + 
 +=== Balisage === 
 +Un document XML est constitué de balises. Une balise est une chaîne de caractères constituant un identificateur et placé entre un caractère < et un caractère >. 
 + 
 +Il existe différentes sortes de balises : 
 +  * Les balises ouvrantes <code><item></code> 
 +  * Les balises fermantes <code></item></code> 
 +  * Les balises vides <code><nop/></code> 
 +  * Les instructions de traitement <code><?xml-stylesheet ... ?></code> 
 +  * Les commentaires <code><!-- J'explique --></code> 
 +  * Les sections CDATA (Character DATA) <code><![CDATA[ Contenu de la section ]]></code> 
 + 
 +==== Conventions de nommage des balises ==== 
 +  * Les noms ne peuvent pas commencer par la chaîne de caractères « xml », dans n'importe quelle combinaison de casse (ou Xml, ou XML…) ; 
 +  * les noms sont sensibles à la casse (différentiation minuscules/majuscules) ; 
 +  * les noms ne peuvent pas débuter par un nombre ou un signe de ponctuation ; 
 +  * les noms ne peuvent pas contenir d'espaces ; 
 +  * éviter les caractères accentués et les opérateurs, virgules, point-virgules… 
 + 
 +==== Les balises ouvrantes ==== 
 +Une balise ouvrante est un élément délimitant une section. La section se termine ensuite par une balise fermante. 
 + 
 +Une balise ouvrante est une chaîne composée de chiffres, de lettres et des caractères - et _. Cette chaîne est comprise entre un &lt; et un &gt;. 
 + 
 +Exemple : 
 +<code Xml [enable_line_numbers="true"]> 
 +<balise> 
 +</code> 
 + 
 +==== Les balises fermantes ==== 
 +Une balise fermante reprend l'identificateur de la balise ouvrante, en le précédent d'un caractère « barre de fraction » ''(slash)''
 +Exemple : 
 +<code Xml [enable_line_numbers="true"]> 
 +</balise> 
 +</code> 
 + 
 +==== Les balises vides ==== 
 +Une balise « vide » est le résultat de la contraction d'une balise ouvrante et d'une balise fermante ne contenant pas de données. 
 +<code Xml [enable_line_numbers="true"]> 
 +<div></div> donne <div /> 
 +</code> 
 + 
 +=== Les attributs === 
 +Les balises ouvrantes et les balises vides peuvent être enrichies avec des attributs. 
 +<code Xml [enable_line_numbers="true"]> 
 +<root> 
 +     <item id="67af65c75b" date="22/01/2006">Contenu de l'élément</item> 
 +     <break mode="immediat"/> 
 +</root> 
 +</code> 
 +Dans l'exemple ci-dessus, la balise ouvrante '''item''' est munie de deux attributs, '''id''' et '''date'''. La balise vide '''break''' est munie de l'attribut '''mode'''
 + 
 +attention|Leurs valeurs doivent obligatoirement être entre guillemets ou apostrophes dactylographiques<ref>http://www.w3schools.com/xml/xml_attributes.asp</ref>
 + 
 +=== Les instructions de traitement === 
 +Une instruction de traitement est destinée à être lue et comprise par un programme spécifique, afin de permettre le traitement du document XML<ref>{{lien web | url = http://www.yoyodesign.org/doc/w3c/xml11/index.html#sec-pi | titre = Le point sur les instructions de traitement | site = yoyodesign.org}}</ref>
 + 
 +Une instruction de traitement commence par un point d'interrogation « ? ». 
 + 
 +Exemple : 
 +<code Xml [enable_line_numbers="true"]> 
 +<?php echo date("d/m/Y") ?> 
 +</code> 
 + 
 + 
 +=== Les commentaires === 
 + 
 +Les commentaires sont des balises qui ne sont pas interprétées par l'application qui traite le document XML. 
 + 
 +Un commentaire est une balise commençant par '''&lt;!--''' et terminant par '''--&gt;'''
 + 
 +Exemple : 
 +<code Xml [enable_line_numbers="true"]> 
 +<!-- Ceci est un commentaire utilisé dans les langages web  --> 
 +</code> 
 + 
 +=== Les entités === 
 +XML 1.0 définit un petit nombre d'entités utilisables dans le document sans nécessiter de déclaration dans le doctype. 
 + 
 +Ces entités sont : 
 + 
 +^ Entité     ^ Caractère ^ Description ^ 
 +| &amp;lt;   | &lt;      | Symbole « inférieur » | 
 +| &amp;gt;   | &gt;      | Symbole « supérieur » | 
 +| &amp;amp;  | &amp;     | Esperluette, « et » commercial | 
 +| &amp;apos; | '         | guillemet simple | 
 +| &amp;quot; | "         | guillemet double | 
 + 
 +Toujours sans déclaration de doctype spécial, on peut écrire une entité avec « &amp; », « # », une référence Unicode<ref name="unicode"/> et un « ; ».  
 + 
 +^ Entité ^ Caractère ^ Description ^ 
 + 
 +| &amp;#960; | π | pi | 
 +| &amp;#946; | β | bêta | 
 +Exemple 
 +<code Xml [enable_line_numbers="true"]> 
 +<balise>Étudions la balise &amp;lt;p&amp;gt;</balise> Étudions la balise &lt;p&gt; 
 +</code> 
 + 
 +===== Structure d'un document XML ===== 
 + 
 + 
 +=== En-tête === 
 +Les trois constituants de l'en-tête que nous allons décrire ne sont pas obligatoires. Ils sont employés en cas de besoin pour fixer l'encodage, définir le doctype et/ou associer une feuille de style. 
 +==== Version, encodage ==== 
 +Il est souhaitable que le document XML commence par l'indication de la version du langage et le jeu de caractères utilisé. C'est souvent utf-8<ref name="unicode"/>. Il est également souhaitable, si le document est stocké sur disque, que l'encodage du fichier soit le même que celui mentionné par l'attribut ''encoding''… 
 +<code Xml [enable_line_numbers="true"]> 
 +<?xml version="1.0"?> <!-- minimal --> 
 + 
 +     <!-- ou --> 
 + 
 +<?xml version="1.0" encoding="utf-8"?> 
 +</code> 
 + 
 +==== Référence au DTD ==== 
 +La deuxième information utile est la mention du doctype. Certains documents XML en ont impérativement besoin, d'autres peuvent s'en passer. 
 +<code Xml [enable_line_numbers="true"]> 
 +<!DOCTYPE root[ 
 +<!ELEMENT root (premier,deuxieme+)> 
 +<!ELEMENT premier (#PCDATA)> 
 +<!ELEMENT deuxieme (#PCDATA)> 
 +]> 
 +</code> 
 +En analysant ce {{wt|doctype}}, l'analyseur syntaxique (le {{wt|parser}}, p.ex. : via [http://www.xmlcooktop.com/ Cooktop] ou encore [http://sourceforge.net/projects/npp-plugins/files/XML%20Tools/ XML tools pour Notepad++]) est en mesure de considérer le document XML comme valide. 
 + 
 +==== Mention d'une feuille de style ==== 
 +Il est possible d'associer un document XML à une feuille de style CSS ou XSL. Si la fonctionnalité fait réfléchir, au début, il y a fort à parier que vous en abandonnerez la pratique par la suite. En effet, la philosophie XML va à l'opposé. 
 +<code Xml [enable_line_numbers="true"]> 
 +<?xml-stylesheet type="text/xsl" href="../../style.xsl"?> 
 + <!-- ou --> 
 +<?xml-stylesheet type="text/css" href="../../style.css"?> 
 +</code> 
 + 
 +=== Une seule racine === 
 +Une balise a un statut spécial, c'est la racine du document XML. C'est à partir de cette balise que se développe l'arborescence du document. 
 + 
 + 
 +=== Règles de mise en œuvre des balises === 
 +  *Toute balise ouverte doit être fermée. 
 +  *Les balises doivent être correctement imbriquées. 
 +  *Les balises sont imbriquables hiérarchiquement sans limitation mais il ne doit y avoir qu'un seul élément à la racine. 
 + 
 +Le corps d'un document XML est une arborescence d'éléments (balises) imbriqués, avec un élément racine unique. 
 +<code Xml [enable_line_numbers="true"]> 
 +<root> 
 +    <balise1> 
 +         <balise2> 
 +         </balise2> 
 +    </balise1> 
 +</root> 
 +</code> 
 + 
 +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> 
  
code_language/xml.1766128245.txt.gz · Dernière modification: 2025/12/19 07:10 de 216.73.216.214