Outils pour utilisateurs

Outils du site


code_language:xml

Ceci est une ancienne révision du document !


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
    <item>
  • Les balises fermantes
    </item>
  • Les balises vides
    <nop/>
  • Les instructions de traitement
    <?xml-stylesheet ... ?>
  • Les commentaires
    <!-- J'explique -->
  • Les sections CDATA (Character DATA)
    <![CDATA[ Contenu de la section ]]>

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 :

  1. <balise>

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 :

  1. </balise>

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.

  1. <div></div> donne <div />

Les attributs

Les balises ouvrantes et les balises vides peuvent être enrichies avec des attributs.

  1. <root>
  2. <item id="67af65c75b" date="22/01/2006">Contenu de l'élément</item>
  3. <break mode="immediat"/>
  4. </root>

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> 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 :

  1. <?php echo date("d/m/Y") ?>

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 :

  1. <!-- Ceci est un commentaire utilisé dans les langages web -->

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

  1. <balise>Étudions la balise &amp;lt;p&amp;gt;</balise> Étudions la balise &lt;p&gt;

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

  1. <?xml version="1.0"?> <!-- minimal -->
  2.  
  3. <!-- ou -->
  4.  
  5. <?xml version="1.0" encoding="utf-8"?>

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.

  1. <!DOCTYPE root[
  2. <!ELEMENT root (premier,deuxieme+)>
  3. <!ELEMENT premier (#PCDATA)>
  4. <!ELEMENT deuxieme (#PCDATA)>
  5. ]>

Autre exemple:

  1. <!ELEMENT bibliography (book)+> <!-- déclaration de l'élément bibliography davant contenir une suite non vide d'éléments book -->
  2. <!ELEMENT book (title, author, year, publisher, isbn, url?)> <!-- Déclaration de l'élément book devant contenir les éléements title, author, ....isbn et url -->
  3. <!ATTLIST book key NMTOKEN #REQUIRED> <!-- Déclaration des attributs obligatoires -->
  4. <!ATTLIST book lang (fr | en) #REQUIRED> <!-- Déclaration des attributs obligatoires -->
  5. <!ELEMENT title (#PCDATA)> <!-- Déclaration de l'élément title davant contenir uniquement du text -->
  6. <!ELEMENT author (#PCDATA)>
  7. <!ELEMENT year (#PCDATA)>
  8. <!ELEMENT publisher (#PCDATA)>
  9. <!ELEMENT isbn (#PCDATA)>
  10. <!ELEMENT url (#PCDATA)>

Opérateur des DTD:

Opérateur Signification Exemple
, Mise en séquence
  1. <!ELEMENT elem (elem1, elem2, elem3)> <!--L'élément elem doit contenir un élément elem1, un élément elem2 puis un élément elem3 dans cet ordre. -->
<noWiki></noWiki> Choix
  1. <!ELEMENT elem (elem1 | elem2 | elem3)> <!-- L'élément elem doit contenir un seul des éléments elem1, elem2 ou elem3 -->

En analysant ce doctype, l'analyseur syntaxique (le 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é.

  1. <?xml-stylesheet type="text/xsl" href="../../style.xsl"?>
  2. <!-- ou -->
  3. <?xml-stylesheet type="text/css" href="../../style.css"?>

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.

  1. <root>
  2. <balise1>
  3. <balise2>
  4. </balise2>
  5. </balise1>
  6. </root>

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
  1. <?xml version="1.0" ?>
  2. <root>
  3. <items>
  4. <item no="1">Premier élément</item>
  5. <item no="2">Autre chose</item>
  6. <item no="3">Troisième élément</item>
  7. <item no="4">Quatrième élément</item>
  8. </items>
  9. </root>

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 :

  1. <adresse
  2. xmlns="http://www.example.com/adresses_postales"
  3. xmlns:ip="http://www.example.com/adresses_ip">

Attribut balise xml

Attribut Description Exemple
xml:lang décrit la langue du contenue de l'élément, sur deux ou trois lettres
  1. <p xml:lang="fr">Bonjour</p>
xml:space permet de faire respecter à une application le traitement des caractères d'espacement; deux valeurs possible: default ou preserve
  1. <p xml:space="default"> titre1</p> <!--L'application traitera les espaces selon ses propres règles -->
  1. <p xml:space="preserve">titre2 </p><!--L'application devra respecter les espaces contenue dans le titre2 à la lettre -->
xml:base Permet de spécifié l'URI (URL+URN) d'un élément
  1. <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
  2. <book xml:base="http://www.somewhere.org/Teaching/index.html">
  3. <chapter xml:base="XML/chapter.html">
  4. <section xml:base="XPath/section.html"/>
  5. <section xml:base="/Course/section.html"/>
  6. <section xml:base="http://www.elsewhere.org/section.html"/>
  7. </chapter>
  8. </book>
xml:id Permet d'attribuer un identificateur à tout élément
  1. <personName xml:id="423"> Gaston </personName>

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). =
  1. self::node()
.. Sélectionne à partir du parent du nœud courant. =
  1. parent::node()
@ Sélectionne les attributs. =
  1. attribute::
| 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 :

  1. Un axe (parent, descendant…).
  2. Un test de nœud (nom ou fonction désignant les nœuds).
  3. Des prédicats (entre crochets).
Axes

Pour décrire les relations entre les nœuds, XPath utilise le vocabulaire suivant :

Axe Abréviation
ancestor
ancêtre
ancestor-or-self
ancêtre ou soi
attribute
@
attribut,
@abc

signifie

attribute::abc
child
enfant,
xyz

signifie

child::xyz
descendant
descendant-or-self
//
//

signifie

/descendant-or-self::node()/
following
suivant
following-sibling
frère suivant
namespace
espace de noms
parent
..
..

signifie

parent::node()
preceding
précédent
preceding-sibling
self
.
soi,
.

signifie

self::node()
Tests de nœuds

Soit l'espace de nom

ns

:

  • //ns:*

    sélectionne tout les éléments du namespace.

  • //ns:nom

    récupère tous les éléments du namespace nommés “nom”.

Tests Notes
comment() trouve tous les commentaires (ex :
<!-- commentaire 1 -->

)

text() trouve un nœud texte, (ex :
hello world

dans

<k>hello<m> world</m></k>

)

processing-instruction() trouve les instructions de traitement (ex :
//processing-instruction('php') trouve <?php echo $a; ?>

)

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
last()
renvoie le dernier nœud de la sélection
position()
renvoie le nœud situé à la position précisée
count(contexte)
renvoie le nombre de nœuds en paramètre
starts-with(chaine1, sous-chaine2)
renvoie true si le premier argument commence avec le second
contains(botte_de_foin, aiguille)
renvoie true si le premier argument contient le second
sum(contexte)
renvoie la somme des valeurs numériques des nœuds en paramètre
floor(nombre)
renvoie le nombre arrondi à l'entier inférieur
ceiling(nombre)
renvoie le nombre arrondi à l'entier supérieur
round(nombre)
renvoie le nombre arrondi à l'entier le plus proche
Exemples

Soit l'arborescence suivante :

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <tronc nom="tronc1">
  3. <!-- commentaire 1 -->
  4. <branche nom="branche1" epaisseur="gros">
  5. <brindille nom="brindille1">
  6. <!-- commentaire 2 -->
  7. <feuille nom="feuille1" couleur="marron" />
  8. <feuille nom="feuille2" poids="50" />
  9. <feuille nom="feuille3" />
  10. </brindille>
  11. <brindille nom="brindille2">
  12. <feuille nom="feuille4" poids="90" />
  13. <feuille nom="feuille5" couleur="violet" />
  14. </brindille>
  15. </branche>
  16. <branche nom="branche2">
  17. <brindille nom="brindille3">
  18. <feuille nom="feuille6" />
  19. </brindille>
  20. <brindille nom="brindille4">
  21. <feuille nom="feuille7" />
  22. <feuille nom="feuille8" />
  23. <feuille nom="feuille9" couleur="noir" />
  24. <feuille nom="feuille10" poids="100" />
  25. </brindille>
  26. </branche>
  27. <branche nom="branche3">
  28. <brindille nom="brindille5">
  29. </brindille>
  30. </branche>
  31. </tronc>

Abréviations

  1. Sélection 1 : toutes les <feuille> d'une <brindille> contenue dans une <branche>, descendant du <tronc>, issu de la racine.
    1. Abrégé :
      /tronc/branche/brindille/feuille
    2. Non abrégé :
      /child::tronc/child::branche/child::brindille/child::feuille
  2. Sélection 2 : la <branche> dont l'attribut “nom” est “branche3”, enfant du <tronc>, inclue dans la racine.
    1. Abrégé :
      /tronc/branche[@nom='branche3']
    2. Non abrégé :
      /child::tronc/child::branche[attribute::nom='branche3']
  3. Sélection 3 : toutes les brindilles ont au moins une feuille.
    1. //brindille[feuille]
  4. Sélection 4 : dernière branche du tronc.
    1. //tronc/branche[last()]
  5. Sélection 5 : tous les noms des brindilles qui n'ont pas de feuille.
    1. //brindille[not(feuille)]/@nom

PHP

Créer le .php suivant à côté du tronc.xml publié ci-dessus.

  1. <?php
  2. $file = 'tronc.xml';
  3. $xpath = "/tronc/branche/brindille/feuille[last()]";
  4. if(file_exists($file)) {
  5. $xml = simplexml_load_file($file);
  6. if($result = $xml->xpath($xpath)) {
  7. print 'Résultats :';
  8. var_dump($result);
  9. } else {
  10. echo 'Syntaxe invalide.';
  11. }
  12. }
  13. else
  14. exit("Le fichier $file n'existe pas.");
  15. ?>
code_language/xml.1761947514.txt.gz · Dernière modification: 2025/10/31 21:51 de 74.7.227.242