Atelier Google Adwords intermediaire 03 les notions fondamentales
Comprendre XML : les notions fondamentales
-
Upload
nabil-nayd -
Category
Technology
-
view
1.437 -
download
2
Transcript of Comprendre XML : les notions fondamentales
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>[email protected]</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>[email protected]</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" ) );