XML eXtensible Markup Language Benjamin SACLIER (MFI) Sources : Georges Gardarin, Jean-Pierre Fournier
XML est issu de la Gestion de Documents (GED) Séparation du fond de la forme. Forme = présentation à partir de la structure (style) Fond = structure + données (contenu) Langage à balises encadrement des champs par des balises début et fin Multiples précurseurs dont les plus connues : SGML pour la structuration HTML pour la présentation
XML= un nouveau langage d'échange basé sur le balisage XML= plus simple que SGML XML= plus ouvert que HTML XML = développé par XML Working Group dirigé par le W3C (depuis 1996) XML 1.0 = recommandation officielle du W3C depuis le 10 février 1998
XML Langage portable, échangeable, universel lisible présentable (navigateurs Web) Avec garantie possible de cohérence des données sans SGBD mais compatible avec tous les SGBD (import-export)
XML standardise la manière dont l'information est: échangée présentée archivée retrouvée transformée cryptée ...
XML c’est quoi ? un langage de balises, héritier de html, sgml… un métalangage : l’utilisateur définit lui-même ses balises exemple xml : <coucou>Un texte</coucou>
XML exemple simple <?xml version="1.0" encoding="UTF-8"?> <listePersonnes> <personne statut ="etudiant" > <nom>Dupont</nom> <prenom>Arthur</prenom> <adresse pays="France"> <numero>10</numero> <rue>rue des Alouettes</rue> <codePostal>91400</codePostal> <ville>Orsay</ville> </adresse> </personne> </listePersonnes> Encodage par défaut Balises ouvrantes et fermantes Balise avec attributs
Exemple complet
Modèle arborescent @Type @Catégorie Nom Restaurant Manager No Adresse Français *** @Catégorie Nom Le Moulin de Mougin Restaurant Manager Dupuis No 7 Adresse Des Vignes Rue Ville Mougin
Au point où nous en sommes Au point où nous en sommes :un document XML est identique à un fichier textuel, mais : il est un peu plus portable (indication de l’encodage employé) chaque information est associée à une « étiquette », sa balise, donc plus facilement identifiable et contrôlable la qualité de sa structure est facile à vérifier pour l’instant, la cohérence de ses informations n’est pas garantie…
Incohérences sémantique Exemple d’un fichier XML de structure correcte avec des incohérences sémantiques: <?xml version="1.0" encoding="UTF-8"?> <!-- commentaire xml --> <listePersonnes> <personne statut="etudiant"> <nom>Dupont</nom> <prenom>12342</prenom> <numero>10</numero> <adresse pays="France"> <rue>rue des Alouettes</rue> <codePostal>Le Guichet</codePostal> <ville>Orsay</ville> </adresse> </personne> </listePersonnes> Prénom numérique numéro mal placé, adresse incomplète…
Contrôle du xml XML n’est vraiment puissant que si la cohérence est contrôlée pour cela, deux technologies au choix: le DTD rudimentaire mais suffisant dans la plupart des cas syntaxe différente le XML-Schéma puissant (données plus fortement typées) syntaxe de style xml DTD ou/et schéma permettent de définir son propre langage basé sur XML Vocabulaire (balises) Grammaire (imbrications) les données de contrôle peuvent être dans le fichier xml lui-même, dans un fichier annexe, sur le Web
DTD Une DTD décrit les balises autorisées dans un document xml, l’ordre dans lequel elles doivent être imbriquées, leurs éventuels attributs, les types des informations qu’elles encapsulent <!ELEMENT listePersonnes (personne+) > <!ELEMENT personne (nom, prenom?, adresse)> <!ATTLIST personne statut CDATA #REQUIRED > <!ELEMENT nom (#PCDATA) > <!ELEMENT prenom (#PCDATA) > <!ELEMENT adresse (numero?, rue, codePostal, ville)> <!ATTLIST adresse pays NMTOKENS #IMPLIED> <!ELEMENT numero (#PCDATA) > <!ELEMENT rue (#PCDATA) > <!ELEMENT codePostal (#PCDATA) > <!ELEMENT ville (#PCDATA) >
Lien xml DTD séparée <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE listePersonnes SYSTEM 'listePersonnes.dtd' > <listePersonnes> <personne statut ="etudiant" > <nom>Dupont</nom> <prenom>12342</prenom> <adresse pays="France"> <numero>10</numero> <rue>rue des Alouettes</rue> <codePostal>Le Guichet</codePostal> <ville>Orsay</ville> </adresse> </personne> </listePersonnes>
XML / DTD 1 seul fichier <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <!DOCTYPE listePersonnes [ <!ELEMENT listePersonnes (personne+) > <!ELEMENT personne (nom, prenom?, adresse)> <!ATTLIST personne statut CDATA #REQUIRED > <!ELEMENT nom (#PCDATA) > <!ELEMENT prenom (#PCDATA) > <!ELEMENT adresse (numero?, rue, codePostal, ville)> <!ATTLIST adresse pays NMTOKENS #IMPLIED> <!ELEMENT numero (#PCDATA) > <!ELEMENT rue (#PCDATA) > <!ELEMENT codePostal (#PCDATA) > <!ELEMENT ville (#PCDATA) >]> <listePersonnes> <personne> <statut libellé="etudiant" /> <nom>Dupont</nom> <prenom>12342</prenom> <adresse pays="France"> <numero>10</numero> <rue>rue des Alouettes</rue> <codePostal>Le Guichet</codePostal> <ville>Orsay</ville> </adresse> </personne> </listePersonnes>
Lien DTD web <?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <!DO'ChTtYtPpE: /l/ilsotceaPlehrossotn/nleisstSeYPSeTrEsMo nnes.dtd' > <listePersonnes> <personne statut ="etudiant" > <nom>Dupont</nom> <prenom>12342</prenom> <adresse pays="France"> <numero>10</numero> <rue>rue des Alouettes</rue> <codePostal>Le Guichet</codePostal> <ville>Orsay</ville> </adresse> </personne> </listePersonnes>
Déclaration d'élément simple <! ELEMENT balise (définition) > Le paramètre définition représente soit un type de donnée prédéfini, soit un élément de données composé, constitué lui même d'éléments Types prédéfinis ANY : L'élément peut contenir tout type de donnée EMPTY : L'élément ne contient pas de données spécifiques #PCDATA : L'élément doit contenir une chaîne de caractère
Déclaration d'élément composé Définit une séquence ou un choix d'éléments Syntaxe spécifique avec opérateurs de composition d'éléments : <! ELEMENT balise (composition) >
Déclaration d’attributs <! ATTLIST balise Attribut Type Mode > balise spécifie l'élément auquel est attaché l'attribut Attribut est le nom de l'attribut déclaré Type définit le type de donnée de l'attribut choisi parmi: CDATA Chaînes de caractères entre guillemets ("aa") non analysées Enumération Liste de valeurs séparées par | <! ATTLIST balise Attribut (Valeur1 | Valeur2 | ... ) > ID et IDREF Clé et référence à clé Mode précise le caractère obligatoire ou non de l'attribut #REQUIRED, #IMPLIED ou #FIXED
Exemple d’une DTD <!ELEMENT listePersonnes (personne+) > <!ELEMENT personne (nom, prenom?, adresse)> <!ATTLIST personne statut CDATA #REQUIRED > <!ELEMENT nom (#PCDATA) > <!ELEMENT prenom (#PCDATA) > une balise « listePersonnes » contient au moins 1 balise personne une balise « personne » contient une balise nom, une éventuelle balise prenom, une balise adresse, le tout dans l’ordre indiqué la balise « personne » contient un attribut « statut » obligatoire + signifie « au moins une » * signifie « au moins zéro » ? signifie « 0 ou 1 » xxx | yyy signifie une de ces deux balises au choix #PCDATA « parsed character data » #REQUIRED = obligatoire, #IMPLIED = facultatif
XML Schéma Limite des DTD Objectif de XML Schéma Description limitée dans des documents structurés Problème de typage (PCDATA) Exprimé dans un langage autre que XML Pas les mêmes parseurs Objectif de XML Schéma Amélioration du typage Amélioration de la structure Nombre borné d’éléments inclus … Remplace de plus en plus la DTD car exprimé en syntaxe XML et extensible
XML Schéma Comme une DTD, le Schéma (xsd) permet de garantir la cohérence des données xml, mais : sa syntaxe est de style xml le niveau de précision est beaucoup plus élevé Dans le document xml : <listePersonnes xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="listePersonnes.xsd">
XML Schéma Déclaration des éléments et attributs Nom Typage similaire à l'objet Spécification de types simples Grande variété de types Génération de types complexes Séquence (Sequence) Choix (Choice) Tas (All)
Les types simples string byte hexBinary integer positiveInteger Confirm this is electric byte -1, 126 hexBinary 0FB7 boolean true, false 1, 0 time 13:20:00.000, 13:20:00.000-05:00 dateTime 1999-05-31T13:20:00.000-05:00 duration P1Y2M3DT10H30M12.3S float -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN integer -126789, -1, 0, 1, 126789 positiveInteger 1, 126789 negativeInteger -126789, -1 nonNegativeInteger 0, 1, 126789 nonPositiveInteger -126789, -1, 0 int -1, 126789675 unsignedInt 0, 1267896754 anyURI http://www.example.com/,
Les types complexes Définition d'objets complexes Exemple <sequence> : collection ordonnée d'éléments typés <all> : collection non ordonnée d'éléments typés <choice>: choix entre éléments typés Exemple <xsd:complexType name="AddresseFR"> <xsd:sequence> <xsd:element name="nom" type="xsd:string"/> <xsd:element name="rue" type="xsd:string"/> <xsd:element name="ville" type="xsd:string"/> <xsd:element name="codep" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="pays" type="xsd:NMTOKEN" fixed="FR"/> </xsd:complexType>
Les Patterns Contraintes sur type simple prédéfini Utilisation d'expression régulières Similaires à celles de Perl Exemple <xsd:simpleType name="NumItem"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-[A-Z]{2}"/> </xsd:restriction> </xsd:simpleType>
XML Schema: exemple (1) <xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <xsd:element name="commande" type="CommandeType"/> <xsd:element name="commentaire" type="xsd:string"/> <xsd:complexType name="CommandeType"> <xsd:sequence> <xsd:element name="livrer" type="Adresse"/> <xsd:element name="facturer" type="Adresse"/> <xsd:element ref="commentaire" minOccurs="0"/> <xsd:element name="produits" type="ProduitType"/> </xsd:sequence> <xsd:attribute name="date_com" type="xsd:date"/> </xsd:complexType>
XML Schema : exemple (2) <xsd:complexType name="ProduitType"> <xsd:sequence> <xsd:element name="produit" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:element name="nom_prod" type="xsd:string"/> <xsd:element name="quantite"> <xsd:simpleType> <xsd:restriction base="xsd:positiveInteger"> <xsd:maxExclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="prix" type="xsd:decimal"/> <xsd:element ref="commentaire" minOccurs="0"/> <xsd:element name="date_livraison" type="xsd:date" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="num_prod" type="xsd:positiveInteger" use="required"/> </xsd:complexType> </xsd:sequence> </xsd:complexType> </xsd:schema>
Feuille de style
Feuille de style La représentation de cette lettre en XML ne comporte aucune indication sur sa mise en page Les aspects graphiques ou typographiques sont absents du source XML Ces aspects seront définis par l’intermédiaire d’une feuille de style Une feuille de style est un ensemble de règles pour spécifier la réalisation concrète d’un document sur un média particulier On ajoute dans le début du fichier xml un lien vers la feuille de style, fichier xsl <?xml-stylesheet type="text/xsl« href="transformateur.xsl"?> Ce fichier peut être local ou accédé via une URL
Conception de DTD/Schéma Possible à partir d’une modélisation ULM
Quelques outils de travail Editeur Outil Support Tibco Turbo XML DTD, XSL Schéma Altova XMLSpy DTD, Schéma XSL, Xquery SyncRO Ltd. Oxygen Data Junction XML Junction Insight Soft. XMLMate DTD, Schéma, XSL, XPath XML Mind XMLMind Editor
Exemple DTD Convertisseur TAC vers XML (metaf2xml) <!ENTITY % cloudType 'AC|ACC|ACSL|AS|CB|CBMAM|CC|CCSL|CI|CS|CU|CF|CUFRA|NS|SAC|SC|SCSL|ST|SF|STFRA|TCU'> <!ENTITY % colourCodes 'BLUplus|BLU|WHT|GRN|YLO|YLO1|YLO2|AMB|RED|FCSTCANCEL'> <!ENTITY % cloudCover 'FEW|SCT|BKN|OVC'> <!ENTITY % cloudFamily '0|1|2|3|4|5|6|7|8|9'> <!ENTITY % phenomDescr 'isFrequent|isOccasional|isIntermittent|isContinuous|isThick|isPrettyThick|isVeryThick|isThin|isPrettyThin|isVeryThin|isFeeble|isPrettyFeeble|isVeryFeeble|isLight|isPrettyLight|isVeryLight|isModerate|isLow|isLower|isIsolated|isConvective|isDissipated|inPastHour|baseBelowStation|isAloft|isAround|isFreezing|isPatchy'> <!ENTITY % unitRadiation 'kJmm|Jcmcm'> <!ENTITY % unitSpeed 'KT|MPS|KMH'> <!ENTITY % period '1d|24h|1h|n'> <!ENTITY % compassDir 'N|NNE|NE|ENE|E|ESE|SE|SSE|S|SSW|SW|WSW|W|WNW|NW|NNW'>
Exemple DTD <!ELEMENT taf (ERROR?, WARNING?, obsStation?, issueTime?, fcstPeriod?, reportModifier?, fcstNotAvbl?, sfcWind?, (CAVOK | (visPrev?, weatherList?, cloudList?, visVert?)), (turbulence | icing | windShearLvl | QNH)*, trendList?, (tempAt | tempMaxAt | tempMinAt | correctedAt | amendedAt | limMetwatch | autoMetwatch | amendment)*, tafRemarkList?)> <!ATTLIST taf s CDATA #REQUIRED>
Exemple xml <?xml version="1.0" encoding="UTF-8"?> <data> <options><format v="xml" /> <lang v="en" /> <mode v="latest" /> <msg_metaf v="" /> <msg_synop v="AAXX 09004 08495 11459 30714 10147 20136 30151 40159 58005 60001 70511 83500 92350 " /> <src_metaf v="noaa" /> <src_synop v="nws_land" /> <type_metaf v="metar" /> <type_synop v="synop" /> </options> <reports> <synop s="AAXX 09004 08495 11459 30714 10147 20136 30151 40159 58005 60001 70511 83500 92350"> <obsStationType s="AAXX"> <stationType v="AAXX" /> </obsStationType> <obsTime s="0900"> <day v="09" /> <hour v="00" /> <minute v="00" /> </obsTime> <windIndicator s="4"><windUnit v="KT" /> </windIndicator> <stationId s="08495"> <id v="08495" /> <region v="VI" /> <precipInd s="1"> <precipIndVal v="1" /> </precipInd> <wxInd s="1"> <wxIndVal v="1" /> </wxInd> <baseLowestCloud s="4"> <from v="300" u="M" /> <to v="600" u="M" /> </baseLowestCloud> <visPrev s="59"> <distance v="9" u="KM" /> </visPrev> <totalCloudCover s="3"> <oktas v="3" /> </totalCloudCover> <sfcWind s="0714"> <wind> <dir v="70" /> <speed v="14" u="KT" /> </wind> </sfcWind> <temperature s="10147 20136"> <air> <temp v="14.7" u="C" /></air>
Exemple Interface WEB
WIS XML/BUFR