comprendre xml : les notions fondamentales

Post on 14-Apr-2017

1.437 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

XML eXtensible Markup Language

XML Introduction

Introduction• XML est une notation• Méta-langage• une manière d'écrire les informations• Langage descriptif: décrit des propriétés plutôt que des traitements• utilise des balises pour délimiter les informations• Données Hiérarchiques• Compréhensible par un humain et par un ordinateur• Un fichier XML est un fichier texte.• Utilisé pour Echanger les données • Supporte tous les alphabets du monde (UTF8)

Méta langage

Utilisation

• XHTML, HTML5• OpenOffice, Microsoft Office Open XML (docx, xlsx, pptx = dossier

zip avec xml + img)• Format graphique : SVG • Les Flux de news : RSS • Les WebServices : XML-RPC et SOAP• JAVA (persistance, hibernate ..), .Net (xaml, dataset …), C++ …• MAthML (échange formule), SMIL(présentation multimédia),   UBL

Rosetta.Net (Universal Business Language : commandes, factures, devis ..) …

• Et bien d’autres …

Exemple<BIBLIOTHEQUE>    <ROMAN>        <TITRE>Imajica</TITRE>        <AUTEUR>Clive Barker</AUTEUR>        <PRIX>6</PRIX>    </ROMAN>

    <ROMAN>        <TITRE>Dune</TITRE>        <AUTEUR>Frank Herbert</AUTEUR>        <PRIX>7</PRIX>    </ROMAN>

    <MAGAZINE>        <TITRE>Science et Vie</TITRE>        <DATEPARUTION>2005-02-01</DATEPARUTION>    </MAGAZINE>

    <ROMAN>        <TITRE>Christine</TITRE>        <AUTEUR>Stephen King</AUTEUR>        <PRIX>5</PRIX>    </ROMAN></BIBLIOTHEQUE>

Exemplede: Julia Royerà: Jean Valjean

Sylvie Picardcc: Luc Royer

Jonas DuprasSujet: InvitationSVP, nous aviser si vous ne pouvez pas y

assister.

<?xml version="1.0" encoding=« utf9" ?><MEMO>

<AUTEUR>Julia Royer</AUTEUR><DESTINATAIRES>

<NOM>Jean Valjean</NOM><NOM>Sylvie Picard</NOM>

</DESTINATAIRES><SUJET>Invitation</SUJET><CC>

<NOM>Luc Royer</NOM><NOM>Jonas Dupras</NOM>

</CC><CORPS><PAR>SVP, nous aviser si vous ne pouvez

pas y assister.</PAR></CORPS>

</MEMO>

Arbre

Structure XML• Ensemble de règles qui définissent la grammaire d'un

dialecte XML :– DTD : Définition du type de document !doctype (.dtd) – Schémas XML (.xsd)

• Permet de vérifier la validité d'un document ;• Permet d'exercer des contraintes sur les contenus;• Permet une prévisibilité des contenus pour un type de document

donné.

Valider

Style XML• Permet de préciser le rendu, la disposition, le formatage

du contenu;– CSS - Cascading Style Sheets– XSL - eXtensible Style Sheets :

• XSL Formating Objects (XSL-FO)• XSL Transformations (XSLT)

Formater / Transformer

Requêtes sur XML• Parcourir les fichiers xml• Xpath : XML Path Language (chemins fichiers)

• Xquery : langage de requête (SQL)

• Xpointer : un fragment de document XML en ligne (URL)

Trouver / Extraire

Parsing• SAX : Simple API for XML, parseur

événementiel (java, c++, perl, php …)

• DOM : Document Object Model, parseur orientés hiérarchie (JavaScript, java, c++ …)

Traiter / programmer

XML Structure du document XML

Structure du document XML• Débute par un prologue (facultatif et non répétable)• Contient un et un seul élément racine; (obligatoire et non répétable)• Peut, par la suite, contenir des commentaires, des instructions de

traitement ou des espaces (facultatifs et répétables)

Le prologue• Une déclaration XML• Des instructions de traitement (<?nom-du-traitement arg1 arg2 argn ?>)• Une déclaration de type de document.

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?><?xml-stylesheet type="text/css" href="maFeuille.css"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Les éléments• L'élément racine est obligatoire et ne peut être répété dans un

document XML. Il forme le contenu proprement dit du document. L'élément racine peut être vide.

• Un élément (element) se compose d'une balise d'ouverture, d'un contenu et d'une balise de fermeture : <para>Bonjour le monde!</para>

• Lorsque le contenu de l'élément est vide, on peut utiliser la forme abrégée suivante : <para />

Les attributsUn attribut (attribute) se compose d'un nom d'attribut, d'un indicateur de valeur, et d'une valeur précédée et suivie par des délimiteurs de littéral " ou ‘ : nom-attribut="valeur-attribut"

<personne nom="John" prenom="Smith"/>Ou<personne>

<nom>John</nom><prenom>Smith</prenom>

</personne>

– Les attributs sont toujours situés à l'intérieur de la balise d'ouverture d'un élément.– Les attributs n'ont pas d'ordre;– Chaque attribut doit être précédé d'un espace;

Sections littérales (section CDATA)

• Les sections littérales constituent un mécanisme qui permet d'insérer dans un document XML une chaîne de caractères qui doit être traitée par le processeur comme étant une chaîne littérale.

• Tout caractère servant de délimiteur sera alors traité comme simple caractère.

<![CDATA[ Voici le <contenu> de la section littérale ]]>

Commentaires<!-- Voici le contenu du commentaire -->

XML Les Chemins XPath

XPath• Permet d’indiquer un ou plusieurs éléments dans un

document xml à l’aide de chemins• Le chemin s’évalue en fonction d’un nœud contexte• A pour résultat :

– un ensemble de nœuds (nodeset)– Une valeur numérique, booléenne ou alphanumérique

• Existe sous une forme abrégé et non abrégé, la forme non abrégé couvre plus de possibilités

XPath• Une suite d’étape :

– [/]étape /étapex/.../étapen• Chemin absolue (nœud context est la racine) :

– /A/B/@att1 • Chemin relatif (à un nœud contexte)

– A/B/@att1• Une étape comprend trois composants :

– axe::filtre[prédicat1][prédicat2] …– l’axe: relation entre le nœud contexte et ceux sélectionnés – le filtre: type des nœuds qui seront retenus– le(s) prédicat(s): propriétés que doivent satisfaire les nœuds

retenus• On peut faire une union de chemins: //A | B/@att1

Xpath : fonctionnement• à partir du nœud contexte, on évalue l’étape1; on obtient

un ensemble de nœuds;• on prend alors, un par un, les nœuds de cet ensemble,

et on les considère chacun à leur tour comme nœud contexte pour l’évaluation de l’étape 2;

• à chaque étape, on prend successivement comme nœud contexte chacun des nœuds faisant partie du résultat de l’étape précédente.

Xpath : les axesAxe résultat

ancestor tout les ancêtres (parent, grandparent ..) du nœud contexte

ancestor-or-self Tout les ancêtres du nœud contexte et le nœud contexte lui-même

attribute Tout les attribut du nœud contexte

child Tout les fils du nœud courant. (axe par défaut, peut être omis)

descendant Tout les descendants (fils, petit fils ..)

descendant-or-self Les descendants et le nœud contexte

following Tout ce qui se trouve dans le document apres la balise de fermeture du nœud courant

following-sibling Les nœuds frères qui suivent le nœud contexte

namespace Tout les nœuds espace de nom du nœud contexte

parent Le nœud parent du nœud courant

preceding Les nœuds qui précédent le nœud courant sauf les parents, ancêtres, attributs et namespace

preceding-sibling Les nœuds frères avant le nœud courant

Self Le nœud contexte lui même

Xpath : les axes

Xpath : les axes

Xpath : filtrer par type de noeud

• text() : nœud de type texte• comment() : nœud de type commentaire• processing-instruction() : nœud de type

instruction de traitement• node() : tout type de nœud

Xpath : les operateurs

+ - * div mod= != < > <= >=

or and

Xpath : Fonctions• string-length( ... ) : longueur d’une chaîne • starts-with( chaîne1, chaîne2 ) : tester si chaîne1 commence par chaîne2 • substring( chaîne1, position1, longueur) : extraction d’une sous-chaîne • normalize-space( chaîne ) : normalisation des occurrences de blancs à 1

blanc ;suppression des blancs d’en-tête et de fin • translate( chaîne, caractères source, caractères destination ) : convertit dans la

chaîne tous les caractères source par leur correspondance (en fonction de la position) dans le dernier argument

• number( chaîne ) : conversion en nombre • string( expression ) : conversion en chaîne • concat( chaîne1, chaîne2 ) : concaténation • contains( chaîne1, chaîne2 ) : tester si chaîne1 contient chaîne2 • floor( nombre décimal ) : arrondi inférieur (10.9 devient 10, par exemple) • ceil( nombre décimal ) : arrondi supérieur (10.1 devient 11, par exemple) • round( nombre décimal ) : arrondi au plus juste (10.4 devient 10 et 10.6 devient 11,

par exemple)

Xpath : Fonctions• count( NodeSet? ) : nombre de noeuds (avg , min , max, sum )• position() : position courante commençant par 1• last( NodeSet? ) : dernière position • name( NodeSet? ) : nom du noeud (tag s’il s’agit d’un élément) avec préfixe éventuel • local-name( NodeSet? ) : nom du noeud sans préfixe • namespace-uri( NodeSet? ) : espace de noms • generate-id( NodeSet? ) : génération d’un identifiant unique• not() : la négation booléenne• …

Xpath : prédicatExpression Description

/bookstore/book[1] Selectionne le premier element enfant book

/bookstore/book[last()] Selectionne le dernier element enfant book

/bookstore/book[last()-1] L’avant dernier element enfant book

/bookstore/book[position()<3] Les deux premiers elements enfant book

//title[@lang] Selectionne tout les titres qui ont un attribut lang

//title[@lang='eng'] Selectionne tout les titre qui ont un attribut lang qui vaut eng

/bookstore/book[price>35.00] Tout les éléments book enfant de l’element racine bookstore qui ont un élément price avec une valeur supérieur à 35

/bookstore/book[price>35.00]/title Selects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00

Xpath : abréviationsExpression Descriptionnodename Sélectionne tout les nœud nommés "nodename"/ Sélectionne depuis le nœud racine

//Sélectionne depuis le nœud contexte tout les nœuds correspondant au critères quelque soit leur niveau dans le document

. Sélectionne le nœud courant

.. Sélectionne le nœud parent@ Sélectionne l’attribut* N’importe quel élément@* N’importe quel attributnode() N’importe quel noeud

Exemple• child::B[child::C]

– B[C]• /descendant::B[attribute::att1and attribute::att2]

– //B[@att1 and @att2]• child::B[position()=last() - 1]

– B[last()-1]• Following-sibling::B[position()=1]

– Following-sibling::B[1]

XML Les Styles CSS / XSLT

Lier un fichier XML avec CSSAprès la déclaration xml dans le prologue du fichier xml :

<?xml-stylesheet href= " style.css" type="text/css"?>

Exemple CSS<contact>

<nom>Logan Lee</nom><tel type="mobile">03 28 41 26 20</tel><tel type="bureau">04 01 49 94 42</tel><tel type="domicile">04 29 79 52 15</tel><email>hendrerit@Crasdolordolor.com</email><adresse>546 Rutrum Street</adresse><ville>Gentbrugge</ville>

</contact><contact>

<nom>Alisa Brady</nom><tel type="mobile">08 56 96 88 56</tel><tel type="bureau">02 20 31 78 32</tel><tel type="domicile">01 76 46 92 49</tel><email>mus@nuncsed.net</email><adresse>P.O. Box 557, 1452 Orci Ave</adresse><ville>Gap</ville>

</contact>

Exemple CSScontact{

display:block;width:50%;border: 4px inset #06F;

}nom{

font-weight:bold;color:#006;display:block;text-align:center;

} tel{

display:block;margin-left:20px;

}tel:before{

content:attr(type) " : ";}

XSLT• Fichier XML

– <?xml version="1.0" encoding="utf-8"?>– un namespace "http://www.w3.org/1999/XSL/Transform"– Un élément racine xsl:stylesheet

• Appliqué à un fichier XML (comme CSS)– <?xml-stylesheet href= " style.xsl" type="text/xsl"?>

• Ensemble de règles / modèles de transformation : les templates– xsl:template

• Les transformations XSL seront appliqué au fichier xml par un processeur (java : Saxon et Xalan, php5 : XSLTProcessor .NetFramework : XslCompiledTransform, les navigateurs ..)– Pour googleChrome la transformation requiert un serveur web

• Transforme un document XML (arbre source) en un autre document (arbre résultat, output )

• Le résultat est un fichier html, svg, fichier texte, pdf, un autre fichier xml …

XSLT<?xml version="1.0" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">...</xsl:stylesheet>

XSLT fonctionnement• Un processeur XSLT traite un document XML en parcourant

les éléments de l’arbre XML correspondant, et en appliquant à certains d’entre eux une règle de transformation choisie parmi l’ensemble des règles constituant le programme XSLT

• Un fichier XSLT contient un ensemble de règles (modèles) :– <xsl:template match="...">

• Une règle se compose de : – un motif (pattern) en xpath indique si l’élément courant est à

traiter ou non– Un modèle de transformation (template) : qui dit par quoi

remplacer l’élément courant (sil correspond au motif)

XSLT : modèle<xsl:template match="...pattern...">

<!-- modèle de transformation -->...<!-- fin du modèle de transformation -->

</xsl:template>

• Le modèle le plus spécifique est le premier à être appliqué– on peut préciser la priorité avec l’attribut priority

• Un modèle contient du texte et/ou des instructions xsl

XSLT : les instructions• on peut mettre des instructions xslt dans le modèle

<xsl:instruction> ... </xsl:instruction>• Le résultat d’une instruction est un texte

– En exception les deux expression <xsl:apply-templates> et <xsl:for-each> qui produisent une liste de nœuds sources à traiter

• Instructions de premier niveau :– <xsl:output method=‘ …type...‘ encoding=‘…' />– <xsl:template match="...">

XSLT : les instructions• Exemple d’instructions :

– <xsl:value-of select="... chemin de localisation ..." /> est remplacée par la valeur (textuelle) de la sélection

– <xsl:copy-of select="..."/> est instanciée sous la forme d’une copie conforme des éléments sélectionnés. (xsl:copy : Copie le noeud courant )

– <xsl:if test=" ... expression XPath ... "> Si la valeur de l’attribut test est égale à true, le modèle de transformation associé est instancié ; sinon, il ne l’est pas

XSLT : les instructions• Exemple d’instructions :

– <xsl:apply-templates/> est remplacée par le fragment de document qui résulte du traitement de la liste des enfants du noeud courant

– <xsl:for-each select="... chemin de localisation ..."> est remplacée par le fragment de document qui résulte du traitement de la liste des noeuds sélectionnés par son attribut select="…"

– <xsl:sort select=“…" data-type=“…"/> est une instruction de tri qui ne s’emploie que comme complément à xsl:apply-templates ou xsl:for-each : elle sert à trier le node-set sélectionné par l’une de ces deux instructions.

XSLT : les instructions<xsl:choose>

<!-- autant de xsl:when que l'on veut, mais au moins 1 en tout --><xsl:when test=" ... expression XPath ... ">

<!-- modèle de transformation --><!-- fin du modèle de transformation -->

</xsl:when><xsl:when test=" ... expression XPath ... ">

<!-- modèle de transformation --><!-- fin du modèle de transformation -->

</xsl:when> ...

<!-- l'élément xsl:otherwise est facultatif --><xsl:otherwise>

<!-- modèle de transformation --> <!-- fin du modèle de transformation -->

</xsl:otherwise></xsl:choose>

XSLT : les instructions• <xsl:text> : insérer un texte non balisé (espaces blancs)

– Si les espaces proviennent du fichier xml utiliser la fonction XPath normalize-space() ou l’instruction xslt <xsl:strip-space>

• <xsl:element name="xxx"> : produit dans le document résultat un élément XML de la forme <xxx> ... </xxx>, dont le nom est fourni par l’attribut name, et dont le contenu est le résultat de l’instanciation du modèle de transformation associé

• <xsl:attribute> : permet de créer un nouvel attribut, dont le nom est fourni par l’attribut name, et la valeur par le modèle de transformation associé. Il est mis dans un xsl:element ou dans un élément literal

• <xsl:attribute-set> : permet de définir un ensemble d’attributs qui pourront être attachés en une seule fois à un élément en utilisant l’instruction <xs:element name="..." use-attribute-sets="...">, ou bien en utilisant un élément source littéral avec un attribut <xsl:use-attribute-sets="..."

Apply-templates• L'élément <xsl:apply-templates> sélectionne d'abord une collection de

nœuds à l'aide de l'expression spécifiée dans l'attribut select. Si cet attribut n'est pas spécifié, tous les enfants du nœud actuel sont sélectionnés. 

• Pour chacun des nœuds sélectionnés, <xsl:apply-templates> demande au processeur XSLT de trouver un <xsl:template> approprié à appliquer. Pour vérifier si les modèles sont applicables, le processeur compare le nœud à l'expression XPath spécifiée dans l'attribut match du modèle. 

• Si plusieurs modèles sont applicables, celui qui possède la plus haute priorité est choisi. Si plusieurs modèles ont la même priorité, celui qui apparaît en dernier dans la feuille de style est sélectionné.

• Si aucun modèle n’est trouvé le processeur appliquera un modèle par défaut

Les modèles par défaut<xsl:template match="text()|@*“>

<xsl:value-of select="."/></xsl:template>

<xsl:template match="text()|@*"> <xsl:value-of select="."/>

</xsl:template>

<xsl:template match="processing-instruction() | comment()"/>

Identity transform

<xsl:template match="/ | @* | node()"><xsl:copy>

<xsl:apply-templates select="@* | node()" /></xsl:copy>

</xsl:template>

Les modes• traiter un même élément du document XML source plusieurs fois de

plusieurs façons différentes dans une même transformation 

<xsl:template match="/"><h2>Table des Matières</h2><xsl:apply-templates select="titre" mode="tdm"/> <h2>Contenu</h2> <xsl:apply-templates select="titre" mode="contenu"/>

</xsl:template>

<xsl:template match="titre" mode="tdm"> ... </xsl:template><xsl:template match="titre" mode="contenu"> ... </xsl:template>

Transformation sous PHP<?php

$doc = new DOMDocument();$doc->load( "carnet.xml" );$xsl = new XSLTProcessor();$xslt = new DOMDocument();$xslt->load( "carnet.xslt" );$xsl->importStyleSheet( $xslt );echo $xsl->transformToXML($doc);

?>

NB: dans le fichier php.ini activer l’extension XSLT en enlevant le point-virgule avant la ligne : extension=php_xsl.dll

Transformation sous JAVAimport javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.stream.StreamResult;import javax.xml.transform.stream.StreamSource;

TransformerFactory factory = TransformerFactory.newInstance();Transformer t = factory.newTransformer(

new StreamSource("carnet.xslt" ) );t.transform(new StreamSource("carnet.xml" ),

new StreamResult("c:/carnet.html" ) );

top related