La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

CHAPITRE 6 INTRODUCTION A XML.

Présentations similaires


Présentation au sujet: "CHAPITRE 6 INTRODUCTION A XML."— Transcription de la présentation:

1 CHAPITRE 6 INTRODUCTION A XML

2 Plan Historique XML Exo 1 DTD Exo 2 XSL Exo 3 SAX DOM

3 Les TP Exo 1 : Ecrire un document XML valide Exo 2 : Ecrire la DTD Exo 3 : Ecrire une feuille de style XSL

4 1. Généralités - Historique
XML signifie Extensible Markup Language C ’est standard reconnu par le W3C depuis février 1998, Il est dérive du SGML dont il représente un sous ensemble, Il avait pour intérêt initial de faciliter l ’échange de données informatique en remplaçant l ’EDI. La version 1.0 est disponible depuis 1998

5 1. Généralités - Historique Le SGML à l’origine du XML !
SGML (Standard Generalized Markup Language) (ISO 8879) est le langage de référence en GED. SGML est devenu une norme internationale en 1986. SGML dissocie la structure d'un texte de sa présentation physique. La typographique, elle est laissée à l’outil de mise en page qui en donne une forme physique. SGML permet de distinguer la structure d'un texte de son contenu.

6 1. Généralités - Comparer HTML & XML : Les forces de HTML
Standard sur les navigateurs du marché, Filtre générant du HTML dans la plupart des outils Bureautique, Portable d ’un environnement à l ’autre : UNIX, WINDOWS, APPLE,.. Facile d ’utilisation & à comprendre, Existence d ’une gamme importante d ’outils sur le marché, Editable & modifiable avec un simple éditeur de textes. Documents souvent peu volumineux.

7 1. Généralités - Comparer HTML & XML : Les lacunes de HTML
HTML ne permet pas de distinguer la partie présentation, de la partie données. Une page HTML est difficilement exploitable pour extraire l’information et la retraiter : Exemple : constituer une base de données de recette en exploitant les nombreux sites disponibles sur Internet ..! Effectuer une recherche dans un ensemble de fichiers HTML donne des résultats approximatif. Exemple : Une recherche dans un moteur de recherche fournit un nombre important de référence sans rapport avec la requête lancée. Impossible de présenter de façons différentes les données d ’une page HTML. Exemple : références croisées. Difficile de compléter les données d ’une page HTML statique. HTML ne permet pas de compléter les balises en fonction des besoins. Evolution des balises soumises au W3C

8 1. Généralités - Comparer HTML & XML : Les Avantages de XML
XML est un langage de spécification Permet la création de balises : Les balises et leurs contenus représentent un structure de données. Séparation du contenu et de la représentation : Les feuilles de styles XSL permettent de formater les données. La définition des Balises est contenu dans un dictionnaire appelé Document Type Definition (DTD) optionnel permettant de créer un dialecte XML. Exemple : Mathematical Markup Language (MathML) Utilisation de XML pour les équations mathématiques Chemical Markup Language (CML) Utilisation de XML pour les objets chimiqies La rédaction d ’un document XML est soumise à des règles strictes, évitant ainsi toute ambiguïté.

9 1. Généralités - Comparer HTML & XML : Les Inconvénients de XML
On ne peut pas aujourd’hui architecturer entièrement un système d’information en XML. XML n’est qu’un élément d’une architecture plus complexe. Les outils de conception actuels sont encore incomplets. Seul IE 5 reconnaît actuellement XML. Navigator à partir de la version 6 interprétera également ce langage. La plupart des navigateurs utilisés aujourd’hui n’interprète pas le XML. Les parseurs disponibles donnent des résultats quelques fois différents. Principalement dans l’interprétation des feuilles de styles.

10 2. Le XML - Spécifications de XML
XML développé par le XML Working Group formé par le W3C en 1996. Les objectifs de conception de XML sont les suivants : 1. XML sera utilisable sans difficulté sur Internet ; 2. XML soutiendra une grande variété d'applications ; 3. XML sera compatible avec SGML ; 4. Il sera facile d'écrire des programmes traitant les documents XML ; 5. Le nombre d'options dans XML doit être réduit au minimum, idéalement à aucune ; 6. Les documents XML devraient être lisibles par l'homme et raisonnablement clairs ; 7. La conception de XML devrait être préparée rapidement ; 8. La conception de XML sera formelle et concise ; 9. Il sera facile de créer des documents XML ; 10. La concision dans le balisage de XML est de peu d'importance.

11 2. Le XML - Structure d ’un fichier XML
Un document XML peut être représenté sous la forme d’un Arbre. Il possède une racine et chaque Elément représente un nœud. <Document> <Intro/> <Chapitre_1> <Titre_1> <Titre_1-1/> <Titre_1-2/> <Titre_1-3/> </Titre_1> <Titre_2/> <Titre_3/> <Chapitre_2/> <Chapitre_3/> <Conclusion/> </Document>

12 2. Le XML - Définition Déclaration :
En première ligne dans un document XML Facultative mais recommandée par le W3C Racine : Elément UNIQUE Eléments : Définissent le contenu d ’une balise XML Peuvent contenir d ’autres éléments Peuvent être vides Peuvent contenir du texte. Attributs : Ajoutent des données à un éléments Entités : Raccourcis Similaires aux constantes

13 Le XML permet de créer ses propres balises.
2. Le XML - Exemple Le XML permet de créer ses propres balises. Exemple de document structuré en XML : <?xml version version="1.0"?> <MOTEURS> <MOTEUR marque = ‘Peugeot’>         <PUISSANCE>5</PUISSANCE>         <CYLINDREE>1.2</CYLINDREE>         <CARBURATION>Essence</CARBURATION > </MOTEUR> <MOTEUR marque = ‘Renault’>         <PUISSANCE>4</PUISSANCE>         <CYLINDREE>1.3</CYLINDREE>         <CARBURATION>Diesel & Diesel</ CARBURATION > </MOTEUR> </MOTEURS> Déclaration Racine Elément Attribut Entité

14 2. Le XML - Type d ’encodage
XML utilise les jeux de caractères de la norme ISO ou Unicode. Standard contrôlé par le W3C, permet de supporter les caractères de tous les langages. Ainsi tous les caractères internationaux peuvent être référencés en utilisant leur représentation Unicode : Ex pour Ä utiliser Ä Les caractères sont codés sur 4 octets pour réduire la taille des chaînes un différents types de codage peut être utilisé : Les plus fréquemment utilisés sont : · UTF-16 : codage des caractères sur 16 bits · UTF-8  : codage des caractères sur 8 bits . UTF-7  : codage des caractères sur 7 bits · ISO <?xml version='1.0' encoding='UTF-8'?>

15 2. Le XML - Document XML Bien Formé
Un document XML doit répondre aux critères suivants: ·les valeurs d'attributs doivent être entre en guillemets " " ·les noms des attributs doivent tous être en minuscules ·toute balise ouverte doit être fermée ex : <p> </p> ·les balises uniques doivent être de la forme <balise/>, ·les caractères < et & écrits < et & ·un document commence par la déclaration suivante : <?xml version="1.0" standalone="yes"?> (yes, s'il est seul et no s'il est accompagné d'une DTD)

16 Donner toujours la préférence aux Eléments
2. Le XML - Eléments ou Attributs ??? Aucune règle existe. Eléments : Pour les informations faisant partie de l ’objet ex Titre d ’un livre. Pour les informations répétées. Pour les informations pouvant être regroupées en unitié logique. Attributs : Les identifiants. Pour éviter des arborescences profondes. Pour limiter les valeurs. Donner toujours la préférence aux Eléments Pour des raisons de performances : Chargement plus rapide Indexation plus rapide (implique une recherche plus rapide)

17 Un document BIEN FORME n’est pas forcément VALIDE
3. La DTD - Définition DTD (Document Type Definition) est l'acronyme Définition de type de document. Elle va permettre de définir la structure interne d’un document XML, Son l'utilisation est facultative. Un document répondant à une DTD est dit VALIDE. La Validation processus de vérification d ’un document XML : Les données sont dans le bonne ordre, Les données sont dans le bon format, Les champs obligatoires sont présents,…. Un document BIEN FORME n’est pas forcément VALIDE

18 3. La DTD - Interne ou Externe
La DTD peut prendre deux formes : ·soit interne, incluse dans une feuille XML ·soit externe, dans un fichier spécifique permettant sa réutilisation. Document avec DTD externe : <?xml version="1.0" standalone =  "no" ?> <!DOCTYPE accueil SYSTEM    "racine.dtd"> <racine>Bonjour!</racine> Document avec DTD interne : <?xml version="1.0" encoding="UTF-8"  standalone =  "yes"  ? > <!DOCTYPE racine [   <!ELEMENT  racine  (#PCDATA)> ]> <racine >Bonjour!</racine > Ces documents s ’auto décrivent. La DTD doit avoir le même nom que la racine.

19 3. La DTD - Les Types d’éléments
La déclaration de type d'élément La déclaration de type d'un élément spécifie le contenu de cet élément. La notation est la suivante : <!ELEMENT NomElément TypeElément> Les différents types EMPTY : pour les éléments sans contenu. Ex <BR/> ANY : pour les éléments dont on ignore le contenu #PCDATA: pour les données textuelles Exemples <!ELEMENT br EMPTY> <!ELEMENT titre (Chapitre|Introduction|Conclusion)> <!ELEMENT auteur (#PCDATA)>

20 3. La DTD - Les Répétitions
Déclaration de l'élément racine : <!ELEMENT documents(document)> Déclaration des éléments fils de la racine : <!ELEMENT document(titre,auteur,texte)> <!ELEMENT titre (#PCDATA)> <!ELEMENT auteur (#PCDATA)> <!ELEMENT texte (introduction?,chapitre+,conclusion?)> Répétition : Par défaut répété une seule fois, ? optionnel, * plusieurs fois ou pas du tout, + au moins une fois.

21 3. La DTD - Les Attributs L’instruction ATTLIST
Cette instruction associe des attributs à un élément : <!ATTLIST document prix CDATA #REQUIRED, // valeur donnée promotion (oui|non)   "non" // Liste de valeurs possibles > Les types d ’attributs : #REQUIRED : obligatoire #IMPLIED : facultatif #FIXED : valeur par défaut spécifiée Exemple : <!ATTLIST element           attribut    (valeur1| valeur2 | valeur3)  "valeur1"> >

22 3. La DTD - Les Schémas Sous l’impulsion de Microsoft, la notion de schéma a été introduite dans XML. Lacune de la DTD : La DTD ne permet pas de spécifier le type d’un élément (string, date, ..) Le Schéma devrait remplacer à terme la DTD. Plus complète elle introduit les notions : De contrainte sur le contenu du modèle. Ordre et séquence des Eléments. De contrainte sur les types de données. Valeurs valides pour une données. Néanmoins, l’absence de spécification, est un frein au développement des Schémas. Les principales propositions sont : XML Data/XML Data Reduced Document Content Description (DCD) : Typage Fort des Données, Limite des valeurs, Héritage.

23 3. La DTD - Les Schémas <?xml version version="1.0"?>
<MOTEURS> <MOTEUR marque = ‘Peugeot’>         <PUISSANCE>5</PUISSANCE>         <CYLINDREE>1.2</CYLINDREE>         <CARBURATION>Essence</CARBURATION > </MOTEUR> <MOTEUR marque = ‘Renault’>         <PUISSANCE>4</PUISSANCE>         <CYLINDREE>1.3</CYLINDREE>         <CARBURATION>Diesel & Diesel</ CARBURATION > </MOTEUR> </MOTEURS>

24 3. La DTD - Les Schémas <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified"> <xsd:element name="MOTEURS"> <xsd:complexType> <xsd:sequence> <xsd:element ref="MOTEUR" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="MOTEUR"> <xsd:sequence maxOccurs="1"> <xsd:element ref="CARBURATION"/> <xsd:element ref="CYLINDREE"/> <xsd:element ref="PUISSANCE"/> <xsd:attribute name="marque" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:NMTOKEN"> <xsd:enumeration value="Peugeot"/> <xsd:enumeration value="Renault"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute>

25 3. La DTD - Les Schémas <xsd:element name="CARBURATION" type="xsd:string"/> <xsd:element name="CYLINDREE"> <xsd:simpleType> <xsd:restriction base="xsd:decimal"> <xsd:enumeration value="1.2"/> <xsd:enumeration value="1.3"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="PUISSANCE"> <xsd:restriction base="xsd:byte"> <xsd:enumeration value="4"/> <xsd:enumeration value="5"/> </xsd:schema>

26 4. Les NAMES SPACES Ils correspondent à une recommandation du W3C datant de janvier 1999. Ils permettent d’identifier de manière unique les balises utilisées dans un document XML. Les espaces de nom sont utilisés afin de bien dissocier les différentes syntaxes que l'on peut trouver dans un document XML. Déclaration : <xsl:stylesheet xmlns:"http//www.w3.org/1999/XSL/Tranform" version= "1.0"> Plusieurs names spaces peuvent être utilisé dans la rédaction d ’un document XML. xmlns:name1="http//…../nspaces/name1.dtd" xmlns:name2="http//…../nspaces/name2.dtd" Dans le Document les éléments seront alors préfixés de nom correspondant à leur names spaces. <name1:element> <name2:element/> </name1:element>

27 5. Feuilles de Style XSL - Définition
Langage de mise en forme de feuille de Style : Il permet la transformation d’une feuille XML. Il permet la manipulation d’un arbre ou chaque élément XML représente un nœud. Il en résulte un nouvel arbre. XSL fournit la plupart des structures de contrôle d’un langage classique. XSL permet de générer des arbres sous différents formats (XML, HTML,..). La transformation XSL : Le résultat s ’obtient en appariant les structures (Pattern matching). Ceci permet donc de sélectionner le nœud, l ’attribut sur lequel doit s ’appliquer une transformation. Un modèle (template) permet d ’indiquer les actions à réaliser lors de l ’appariement. Il est composé de règles de mise en forme.

28 5. Feuilles de Style XSL - Rôle
XSL est utiliser pour transformer un page XML en HTML en WML ... Une page XML est une source de données. Les pages XSL sont des représentations différentes des données : Références croisées, cumuls, tris, traitements divers sur les données,… Une page XSL est un document XML bien formé. Attention la DTD de l ’arbre destination peut-être différente de l ’arbre d ’origine. On compare souvent CSS à XSL. CSS ne dispose pas de structure de contrôle, il ne permet que la mise en forme.

29 5. Feuilles de Style XSL - Exemple page XML
Déclaration Lien XSL <?xml version="1.0"? <?xsl:stylesheet type="text/xsl" href="exemple.xsl"?> <documents> <article> <auteur> Dupond </auteur> <date> 01 janvier 2001 </date> <titre> Le XSL </titre> </article> <auteur> Martin </auteur> <date> 10 janvier 2001 </date> <titre> Le XML </titre> </documents> Racine XML

30 5. Feuilles de Style XSL - Exemple page XSL
<?xml version="1.0"?> <xsl:stylesheet xmlns:"http//www.w3.org/1999/XSL/Tranform" version= "1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <BODY>    <xsl:apply-templates select=“article”/> </BODY> </html> </xsl:template> <xsl:template match="article"> ... </xsl:template> Déclaration Names Spaces Type de sortie Template racine HTML Application d’un modèle aux noeuds fils Template article

31 5. Feuilles de Style XSL - Le matching
<xsl:template match="…"> </xsl:template> * correspond à n'importe quel élément element1 | element2 trouve tous les élément element1 et element2 element1 / element2 trouve tous les éléments elemen2 ayant element1 comme parent element1 // element2 correspond à n'importe quel élément element2 dont un ancêtre est element1 / correspond au noeud racine text() correspond à n'importe quel noeud textuel processing-instruction() correspond à n'importe quel instruction de traitement node() correspond à n'importe quel noeud autre qu'un noeud attribut et que le noeud racine element1 [1] correspond au premier des éléments element1 d'un parent element1 [last()=1] correspond à n'importe quel élément element1 qui est l'unique élément element1 de son élément parent element1 / element2[position()>1] correspond à tous les éléments element2, autres que le premier, et dont le parent est element1 @class correspond à tous les attributs class @* correspond à n'importe quel attribut

32 5. Feuilles de Style XSL - Structures de contrôles
Création de variables <xsl:variable  name = variable select = expression> </xsl:variable> Création d'éléments : <xsl:element name = element> </xsl:element> Création d’attributs : <xsl:attribute name = attribut> </xsl:attribute> Création d’un text : <xsl:text> blabla </xsl:text>

33 5. Feuilles de Style XSL - Structures de contrôles
Insertion de la valeur d’un élément : <xsl:value-of select="."/> <xsl:value-of select="nom"/> Boucle : <xsl:for-each select="element"/> … </xsl:for-each> Tri : <xsl:sort select="element" order="descending"/> Alternative : <xsl:if test="expression"/> … </xsl:if> Exemple : <xsl:if test= "position()=last()"/> … </xsl:if> <xsl:choose> <xsl:when test="expression"/> … </xsl:when> <xsl:otherwise> … </xsl:otherwise> </xsl:choose>

34 5. Feuilles de Style XSL - Exemple
Règle modèle <xsl:template match = "personnel"> <center> Liste Employe</center> <xsl:for-each select="employe[position()mod 2 = 1]"> <xsl:sort select="nom"/> <xsl:call-template name="employeCall"> <xsl:with-param name="nom"> <xsl:value-of select="nom"/> </xsl:with-param> </xsl:call-template> <xsl:element name="br"/> </xsl:for-each> </xsl:template> Boucle Appel d'une règle Paramètre Création d'un Element

35 5. Feuilles de Style XSL - Exemple
<xsl:template name="employeCall"> <xsl:param name="nom"/> <b> <xsl:if test="position() mod 2 = 1"> <xsl:value-of select="$nom"/> </xsl:if> </b> </xsl:template> z Règle modèle Récupération du Paramètre Conditionnelle Affichage d'une variable

36 6. Les API - SAX Interface Simple API for XML (SAX).
Ces API sont orientées événements. Le gestionnaire d ’événement est similaire à celui de Windows pour gérer les IHM. Le moteur SAX déclenche un événement lorsqu’il détecte une balise de début ou une balise de fin. Implémenté en JAVA, Python, PHP. Avantage : Ne charge pas globalement le fichier XML en mémoire avant de commencer le traitement. Inconvénient : Pas de construction d’arbre Fonction PHP3 : int xml_set_element_handler(int parser, string startElement, string endElement); parser : pointeur sur un objet parseur startElement : fonction déclenchée lorsqu’une balise de début est rencontrée. endElement : fonction déclenchée lorsqu’une balise de fin est rencontrée.

37 6. Les API - SAX Exemple en PHP Fonction exécutée pour traiter
le début d’un élément $file = "data.xml"; $depth = array(); function startElement($parser, $name, $attrs) { ... } function endElement($parser, $name) $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); xml_parser_free($xml_parser); Fonction exécutée pour traiter la fin d’un élément Objet Parser Associe les Evts Traite le fichier Gestion des Erreurs

38 6. Les API – Appariage en PHP 4
Chaine XSL <?php $xslData = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="article"> <h2><xsl:value-of select="title"></h2> <h3><xsl:value-of select="author"></h3> </xsl:template> </xsl:stylesheet>'; $xmlData = ' <?xml version="1.0"> <article> <title>Learning German</title> <author>Sterling Hughes</author> </article>'; if (xslt_process($xslData, $xmlData, $result)){ //OK } else { // Erreur } ?> Chaine XML Appariage

39 7. Les API - DOM Le DOM est une interface de programmation.
Il fournit un ensemble de fonctions : Permettant la manipulation de document XML. La création de document XML. Contrairement à SAX, le document XML est représenté en mémoire sous la forme d ’une structure hiérarchique. Les API disponibles, permettent de charger, parcourir, copier, créer, manipuler les nœuds de l ’arbre représentant ainsi les éléments du document XML. L’inconvénient majeur, est le chargement globale du document XML en mémoire. Peut entraîner des problèmes de temps de réponse lors du traitement des documents volumineux. Le DOM est implémenté dans les langages : JAVASCRIPT, VB SCRIPT donc très souvent utilisé dans les ASP.

40 7. Les API - DOM Les fonctions de base
xmlDoc.documentElement : Elément Racine xmlDoc.load("document.xml") : Chargement en mémoire d’un document XML xmlDoc.async : Mode de chargement en mémoire Asynchrone / Synchrone noeud.firstChild : Premier fils d’un nœud noeud.lastChild : dernier fils d’un nœud noeud.parentNode : Nœud Parent d’un nœud noeud.childNodes[] : Tableau des nœuds fils noeud.selectNodes("nom") : Retourne le tableau des nœuds fils ayant pour nom nom. noeud.getAttributes("att") : la valeur de l ’attribut att du nœud. noeud.setAttributes("att",valeur): Positionne la valeur de l ’attribut att du nœud. noeud.hasChildNodes() createElement("nom") loadXML("chaine")

41 7. Les API - DOM Parcours d’un arbre en ASP
Language=JavaScript %> <% xmlDoc = Server.CreateObject("MSXML2.DOMDocument"); xmlDoc.async = false; xmlDoc.load(Server.mapPath ("personnel.xml")); racineDoc = xmlDoc.documentElement; for (i = 0 ; i < racineDoc.childNodes.length ; i++) { employe = racineDoc.childNodes[i]; Response.write ("<BR><HR><BR>Nom : "); Response.write (employe.childNodes[0].text + " " + employe.childNodes[1].text + " " + employe.childNodes[2].text); } %> Objet DOM Chargement Synchrone Chargement du document Racine Nbre de Nœuds Fils Parcours des Fils Traitement des Fils

42 7. Les API – DOM – Appariage XSL en ASP
LANGUAGE = JScript %> <% var sourceFile = Server.MapPath("simple.xml"); var styleFile = Server.MapPath("simple.xsl"); var source = Server.CreateObject("Microsoft.XMLDOM"); source.async = false; source.load(sourceFile); var style = Server.CreateObject("Microsoft.XMLDOM"); style.async = false; style.load(styleFile); Response.Write(source.transformNode(style)); %> Doc XML Doc XSL DOM XML DOM XSL Appariage

43 8. Les logiciels - Les parsers XML
Coté Serveur Les parsers Validant Microstar Aelfred Les parsers non Validant MSXML (intégré à IIS) IBM XMLJ Côté client Internet Explorer 5.0 Netscape Navigator V6 Interface de programmation Interface Simple API for XML (SAX) Interface Document Oject Model (DOM)

44 8. Les logiciels - Parsing coté client
IE 5 / Navigator 6

45 8. Les logiciels - Parsing coté serveur

46 8. Les logiciels - Les langages de requêtes
XML-QL Proposé par Bell Labs Il permet d'interroger des documents XML Il fournit également un interface de création de document XML Ce langage est inspiré du SQL XQL Proposé par Microsoft Il permet d'interroger des documents XML via XSL Base de données Orientés Objets Elles génèrent des documents XML ORACLE v 8i SQL Serveur 2000 fournit des fonctionnalités XML

47 8. Les logiciels - Les éditeurs XML
Editeurs XML XML Notepad (Parser Microsoft) XMLPRO (Parser IBM XML 4J) Xmetal de softquad Editeurs DTD XML Autority : Construction graphique d ’un DTD Near & Far Designer XML Editeurs XSL eXcelon Stylus XML SPY

48 9. Les Références - Les sites WEB
La référence dans le domaine :

49 9. Les Références - Les ouvrages
La référence dans le domaine : XML. Langage et applications de MICHARD, Alain EYROLLES INTRODUCTION AU XML SAINT-LAURENT Simon OSMAN EYROLLES MULTIMEDIA 2000 XSLT Programmer's Reference Michael KAY Edition WROX


Télécharger ppt "CHAPITRE 6 INTRODUCTION A XML."

Présentations similaires


Annonces Google