XML : rappels Dan VODISLAV Université de Cergy-Pontoise Master Informatique M2 Plan • XML: principes, syntaxe • Schémas XML: DTD et XML Schema • XPath Page 2 XML: eXtensible Markup Language • Langage de description de documents structurés – Utilisation de balises pour définir une structure (balisage structurel) • Standard W3C pour l’échange et la publication de données sur le web Ex: Bibliographie • G. Gardarin, XML : des bases de données aux services web, Dunod, 2003 • S. Abiteboul, N. Polyzotis, The Data Ring, CIDR, 2007 <bibliographie> <ouvrage année="2003"> <auteur>G. Gardarin</auteur> <titre>XML : Des Bases de Données aux Services Web</titre> <éditeur>Dunod</éditeur> </ouvrage> <ouvrage année="2007"> <auteur>S. Abiteboul</auteur> <auteur>N. Polyzotis</auteur> <titre>The Data Ring</titre> <conférence>CIDR</conférence> </ouvrage> </bibliographie> Page 3 Syntaxe XML • Un document XML contient: – Un prologue: présence facultative, mais fortement conseillée <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> <!DOCTYPE document SYSTEM "document.dtd"> – Un arbre d’éléments: obligatoire <document> <salutation>Bonjour!</salutation> </document> – Des commentaires et des instructions de traitement: facultatifs <!–- Ceci est un commentaire --> <?xml-stylesheet type="text/xsl" href="style.xsl"?> Page 4 Arbre d’éléments • Un document est formé d’une hiérarchie (arbre) d’éléments – L’arbre a un élément racine unique – Le contenu d’un élément est délimité par des balises – Tout élément fils est inclus dans son parent : <a><b></a></b> n’est pas correct • Un élément est de la forme: <nom attr='valeur'> contenu </nom> – <nom> : balise d'ouverture – </nom> : balise de fermeture, obligatoire (sauf pour les éléments vides <nom/>) • nom formé de lettres, chiffres, ‘_’, ‘-’, ‘.’, ‘:’ (signification spéciale) • commence par une lettre ou par ‘_’ et ne commence pas par les caractères « xml » – contenu : contenu d'un élément • vide, texte, autres éléments, imbrication de texte et d ’autres éléments • instructions de traitement, commentaires – attr='valeur' : ensemble éventuellement vide d'attributs • la valeur doit être délimitée par des apostrophes ou des guillemets <rapport langue='fr' dern-modif='08/07/99'> Page 5 Les DTD • DTD = grammaire pour la structure des documents – Facultative, interne ou externe au document – Contient des déclarations pour les éléments, attributs, entités, notations utilisés • Avantages de l’utilisation de DTD – Partage d’une même structure entre plusieurs documents, structures « standard » pour une communauté – Vérification stricte et automatisable de la correction des documents Document DTD <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> <!DOCTYPE document SYSTEM "accueil.dtd"> <document type='exemple'> <salutation> Bonjour! </salutation> </document> <!–- fichier accueil.dtd. Exemple de DTD simple --> <!–- Définition de <!ELEMENT document <!–- Définition de <!ATTLIST document l'élément racine --> (salutation)> l’attribut type pour l’élément document --> type CDATA #IMPLIED> <!–- Un élément salutation ne contient que du texte --> <!ELEMENT salutation (#PCDATA)> Page 6 Déclaration d’éléments <!ELEMENT nom modèle> • Modèles de contenu – Sous-éléments : plusieurs façons de les combiner • séquence : <!ELEMENT chapitre (titre,intro,section)> • alternative : <!ELEMENT chapitre (titre,intro,(section|sections))> • indicateurs d'occurrence: * (0-n), + (1-n), ? (0-1) <!ELEMENT chapitre (titre,intro?,section+)> <!ELEMENT section (titre-section,texte-section)> <!ELEMENT texte-section (p|f)*> – Données : texte <!ELEMENT p (#PCDATA)> Page 7 Modèles de contenu pour les éléments (suite) • Mixte : mélange de texte et de balises (comme dans HTML) <!ELEMENT p (#PCDATA|em|exposant|indice|renvoi)*> • Libre : contenu bien formé, mais sans restrictions <!ELEMENT p ANY> • Vide : pas de contenu, seuls les attributs sont importants <!ELEMENT p EMPTY> – Exemple <!ELEMENT p (#PCDATA|bibref)* > <!ELEMENT bibref EMPTY> <!ATTLIST bibref ref IDREF #REQUIRED> – utilisation: <p> consulter <bibref ref='REF-19980210'/> </p> Page 8 Déclaration d’attributs <!ATTLIST nom-élém nom-attr type-attr décl-défaut nom-attr type-attr décl-défaut … > – Pour un élément donné on décrit la liste de ses attributs – Chaque attribut: un nom, un type et une valeur par défaut – Remarque: l’ordre des attributs n’est pas important Ex. <!ELEMENT ex (#PCDATA)> <!ATTLIST ex cible ID #REQUIRED propriétaire CDATA #IMPLIED nb (1 | 2 | 3) '1' > • Valeur par défaut d'un attribut – La valeur en question donnée explicitement – #REQUIRED : attribut obligatoire, valeur à être précisée dans le document – #IMPLIED : attribut facultatif, valeur à être précisée dans le document – #FIXED (suivi de la valeur) : valeur de l’attribut fixée pour tout élément instance Page 9 Attributs de type ID et IDREF • Permettent de créer des renvois à l'intérieur d'un document – ID: identifie l’élément référencé, IDREF: crée le renvoi – Transforment la structure d’arbre du document en graphe • Exemple DTD <!ELEMENT personne (nom, …)> <!ATTLIST personne num ID #REQUIRED> <!ELEMENT livre (titre, auteur+, …)> <!ELEMENT auteur EMPTY> <!ATTLIST auteur ref IDREF #REQUIRED> Document <personne num=‘p1’><nom>Gardarin</nom></personne> <personne num=‘p2’><nom>Valduriez</nom></personne> <livre> <titre>Bases de données</titre> <auteur ref=‘p1’/> <auteur ref=‘p2’/> </livre> Page 10 Documents bien formés et documents valides • Document XML bien formé : document correct sans DTD – le prologue ne contient pas de déclaration de type de document (DTD) – contient un arbre d'éléments correct <?xml version="1.0" standalone="yes" ?> <document> <salutation>Bonjour!</salutation> </document> • Document XML valide : document correct avec DTD – son prologue contient une déclaration de type de document (DTD) – son arbre d'éléments respecte la structure définie par la déclaration de type <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> <!DOCTYPE document [ <!ELEMENT document (salutation)> <!ELEMENT salutation (#PCDATA)> ]> <document> <salutation>Bonjour!</salutation> </document> Page 11 Formes sérialisée et arborescente • Forme sérialisée d’un document/élément – Chaîne de caractères (texte) incluant balises et contenu textuel Exemple <lettre type='court'><salutation>Bonjour!</salutation><fin>Au revoir</fin></lettre> ou avec un peu de mise en forme <lettre type='court'> <salutation>Bonjour!</salutation> <fin>Au revoir</fin> </lettre> • Forme arborescente – Utilisée par les applications, modèle DOM (W3C) lettre type court salutation fin Bonjour! Au revoir Page 12 DTD et XML Schema • Limitations des DTD – Peu de types de contenu et d’attributs (essentiellement du texte) vérif. limitée – Les DTD ne sont pas en format XML! • Standard pour les schémas XML plus avancés XML Schema – – – – Format XML Une large palette de types: entiers, réels, dates, booléens, etc. Contraintes d’intégrité: notions de clé, unicité … • Exemple: type complexe CinemaType – Nom (string) – Adresse (AdresseType, complexe) – Séances (SeanceType, complexe) DTD <!ELEMENT Cinema (Nom, Adresse, Seance*)> <!ELEMENT Nom (#PCDATA)> <!ELEMENT Adresse (Ville, Rue, Numero)> ... Page 13 Exemple (suite) XML Schema <xsd:element name=’Cinema’ type=’CinemaType’/> <xsd:complexType <xsd:sequence> <xsd:element <xsd:element <xsd:element name=’CinemaType’> name=’Nom’ type=’xsd:string’/> name=’Adresse’ type=’AdresseType’/> name=’Seance’ type=’SeanceType’ minOccurs=’0’ maxOccurs=’unbounded’/> </xsd:sequence> </xsd:complexType> <xsd:complexType name=’AdresseType’> <xsd:sequence> <xsd:element name=’ville’ type=’xsd:string’/> <xsd:element name=’rue’ type=’xsd:string’/> <xsd:element name=’numero’ type=’xsd:decimal’/> </xsd:sequence> </xsd:complexType> Page 14 XPath • Langage de sélection d’un ensemble de nœuds dans un document XML – Utilise des expressions de chemin pour désigner des nœuds dans l’arbre – Les expressions XPath sont utilisées dans d’autres langages: XSLT, XQuery, … • Une expression de chemin XPath – S’évalue en fonction d’un nœud contexte – Désigne un ou plusieurs chemins dans l’arbre du document à partir du nœud contexte – A pour résultat un ensemble de nœuds de l’arbre (qui se situent au bout des chemins) • Types de nœuds – Document, Element, Attribute, Text, Comment, ProcessingInstruction • XPath offre aussi des expressions littérales (texte, numérique, booléen) • Ex: 1 + 2 Page 15 Syntaxe XPath • Expression de chemin: suite d’étapes [/]étape1/étape2/…/étapen • Idée: chaque étape successive détermine un ensemble de nœuds – Une étape utilise chacun des nœuds désignés par l’étape précédente comme nœud contexte pour la suite de l’évaluation • Étape = axe::filtre[prédicat1]…[prédicatn] Exemple: child::B[position()=1] (abréviation: B[1]) – Axe: optionnel (par défaut child) • Spécifie un ensemble des nœuds par rapport au nœud contexte + un ordre – Filtre: obligatoire, décrit le sous-ensemble de nœuds de l’axe retenu – Prédicats: optionnels, décrivent les conditions à satisfaire par les nœuds • Combinés par l’opérateur "ET" logique Page 16 Axes XPath • Douze axes – – – – – – – – – – – – child (axe par défaut): enfants directs du nœud contexte parent (..): nœud parent attribute (@): nœuds attribut du nœud contexte descendant (//): nœuds descendants du nœud contexte descendant-or-self: descendants, y compris le nœud contexte ancestor: nœuds ancêtres du nœud contexte ancestor-or-self: ancêtres, y compris le nœud contexte following: nœuds suivants dans l’ordre du document following-sibling: frères suivants dans l’ordre du document preceding: nœuds précédents dans l’ordre du document preceding-sibling: frères précédents dans l’ordre du document self (.): le nœud contexte lui-même • Attributs: seul l’axe attribute désigne des nœuds attribut ! Page 17 Filtres et prédicats • Filtres: deux façons de filtrer les nœuds d’un axe: – Par leur nom • Pour les nœuds qui ont un nom (Element, Attribute, ProcessingInstruction) – Par leur type • text(), comment(), processing-instruction() • * : nœuds de type élément ou attribut • node() : tous les types de nœud • Prédicat: tests connectés par les opérateurs logiques "ET" et "OU" – Négation: par la fonction not() • Test = expression booléenne élémentaire: comparaison, fonction booléenne – Expression de chemin convertie en booléen • Ensemble de nœuds: false si l’ensemble est vide, sinon true • Numérique: false si 0 ou NaN (« not a number »), sinon true • Chaînes de caractères: false si chaîne vide, sinon true Page 18 Fonctions XPath • Pour nœuds – count(expr): nombre de nœuds dans l’ensemble produit par l’expression – name(): nom du nœud contexte • Pour chaînes de caractères – concat(ch1, ch2, …): concaténation – contains(ch1, ch2): vérifie si ch1 contient ch2 – substring(ch, pos, l): extrait la sous-chaîne de ch de longueur l, commençant à la position pos (les positions démarrent à 1) – string-length(ch): longueur de la chaîne • Pour booléens – true(), false(): les valeurs vrai/faux – not(expr): négation de l’expression logique • Pour numériques – sum(expr): somme des valeurs des nœuds produits par l’expression – avg(expr): moyenne des valeurs des nœuds produits par l’expression Page 19 Exemples • • • • • • • • • • • • • • • • • D D/text() descendant::node() .. following::node() preceding-sibling::node() //@att1 /A//D /comment() ../* /A/B//text()[1] /A//text()[1] //B[@att1="a2"]/D /A/B[last()] //B[count(D)>1] /A/C[not(D)] /A[B[D="Texte1"]/@att1]/C/@att2 Page 20