0% ont trouvé ce document utile (0 vote)
17 vues49 pages

Introduction au schéma XSD en XML

Transféré par

hiba.lafkir
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
17 vues49 pages

Introduction au schéma XSD en XML

Transféré par

hiba.lafkir
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Chapitre 13

XSD
(XML Schema Definition)
I. Introduction

Le schéma XSD (XML Schema Definition) a pour objectif de définir la


structure d'un document XML. Plus précisément, il permet de décrire les
éléments et les attributs qui peuvent apparaître dans le document XML,
ainsi que les types de données autorisés pour ces éléments et attributs. En
d'autres termes, un schéma XSD définit les règles et les contraintes que le
document XML doit respecter pour être considéré comme valide selon ce
schéma.

27/03/2024 2
II. Schéma XML(XSD)
Structure de base
❑ Comme tout document XML, un Schéma XML commence par un prologue et a un
élément racine.

<?xml version="1.0" encoding="ISO-8859-1"?>


<xsd:schema …>
<!-- déclarations d'éléments,d'attributs et de types ici -->

</xsd:schema>

❑ Tout élément d'un schéma doit commencer par le préfixe xsd ou xs

27/03/2024 3
❑L'élément racine est l'élément xsd:schema. Cet élément racine est
accompagné d’attributs qui précisent le lieu de définition des éléments
comme suit :

xmlns:xsd="[Link]

Indique que les éléments et les types utilisés (schema, element,


complexType, sequence, string, boolean, etc.) sont définis dans l’espace
indiqué entre " " et qu’ils doivent être préfixés par xsd ou xs.

27/03/2024 4
Exemple de schéma XSD ([Link]) :
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="[Link]
<!-- déclarations d'éléments, d'attributs et de types ici -->
<xsd:element name="pages" type="xsd:positiveInteger"></xsd:element>
<xsd:element name="auteur" type="xsd:string"></xsd:element>
<xsd:element name="livre">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="auteur"/>
<xsd:element ref="pages"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
27/03/2024 5
Référencement de schema depuis un document XML:

<?xml version="1.0" encoding="UTF-8" ?>


<livre xmlns:xsi="[Link]
xsi:noNamespaceSchemaLocation="[Link]">
<auteur>toto titi</auteur>
<pages>11</pages>
</livre>

27/03/2024 6
❑ Déclaration d'éléments:
Un élément dans un schéma se déclare avec la balise <xsd:element>
Exemple:

<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema …>

<xsd:element name="remarque" type="xsd:string"/>

<xsd:element name="contacts" type="xsd:string"/>

</xsd:schema>

Ce schéma déclare deux éléments : remarque et contacts


A chaque élément est associé un type via l'attribut type.
27/03/2024 7
Les types de données

❑ XML Schema permet donc de spécifier des types de données bien plus finement que
le langage DTD (Document Type Definition).

Il distingue notamment deux types :

❑ Types simples

❑ Types complexes

27/03/2024 8
Types simples
• Ne peuvent comporter ni attributs, ni éléments enfants.

❑ Syntaxe de déclaration :
<xs:element name="mon_nom" type="xs:mon_type"/>
ou
<xsd:element name="mon_nom" type="xsd:mon_type" />

❑ Exemples
<!-- Ne contient ni attribut ni aucun autre élément => élément simple -->
<nom>ROBERT</nom>

<!-- Contient un attribut => n'est pas un élément simple -->


<!-- Cependant l'attribut "sexe" est un élément simple -->
<personne sexe="masculin">TATA TOTO</personne>
27/03/2024 9
<!-- La balise personne contient d'autres éléments (les balises nom et
prénom) => n'est pas un élément simple -->
<personne>
<!-- Ne contient ni attribut ni aucun autre élément => élément simple -->
<nom>TOTO</nom>
<!-- Ne contient ni attribut ni aucun autre élément => élément simple -->
<prenom>TATA</prenom>
</personne>

❑ Schéma associé
❑ Document XML <xs:element name="nom" type="xs:string"/>

<nom>Toto</nom> <xs:element name="age" type="xs:integer"/>

<age>34</age> <xs:element name="daten" type="xs:date"/>

<daten>2020-01-01</daten>

27/03/2024 10
LES TYPES SIMPLES (1):

27/03/2024 11
LES TYPES SIMPLES (2):

27/03/2024 12
LES TYPES SIMPLES (3):

27/03/2024 13
LES TYPES SIMPLES (4):

27/03/2024 14
Valeur par défaut et valeur fixée
Un élément simple peut avoir une valeur par défaut ou une valeur fixée.
o Une valeur par défaut est assignée si aucune autre valeur n’est affectée.
<xs:element name="color" type="xs:string" default="red"/>

o Une valeur fixée est aussi assignée mais ne peut pas être changée.
<xs:element name="color" type="xs:string" fixed="red"/>

Déclaration d’attributs
Les attributs sont déclarés de types simples

<xsd:attribute name="mon_nom" type="xsd:mon_type" />


ou
<xs:attribute name="mon_nom" type="xs:mon_type"/>
27/03/2024 15
o Exemple d’élément XML qui contient un attribut
<lastname lang="EN">Smith</lastname>
o Voici la définition correspondante de type simple
<xs:attribute name="lang" type="xs:language"/>

❑ On peut également affecter une valeur par défaut.


<xs:attribute name="lang" type="xs:string" default="EN"/>
❑ On peut également affecter une valeur fixe.
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
❑ Attributs optionnels par défaut :
<xs:attribute name="lang" type="xs:string" use="optional"/>
❑ On peut les rendre obligatoires:
<xs:attribute name="lang" type="xs:string" use="required"/>
27/03/2024 16
❑ Restriction
L'opérateur xsd:restiction définit des valeurs acceptables pour les éléments ou les
attributs donné par l'attribut base.

Les restrictions sur les éléments XML sont appelées facettes.

Syntaxe:
<!-- création -->
<xsd:simpleType name="mon_type_perso">
<xsd:restiction base="mon_type">
<!-- liste des restrictions -->
</xsd:restriction>
</xsd:simpleType>
<!-- utilisation-->
<xsd:element name="mon_nom" type="mon_type_perso"/>
27/03/2024 17
Résumé des contraintes sur les types de données

27/03/2024 18
Exemple 1: nombre minimum de caractères d’une chaine est 9
<xs:simpleType name="mpType">
<xs:restriction base="xs:string">
<xs:minLength value="9"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="mot_de_passe" type="mpType"/>

Exemple 2: nombre borné entre 0 et 50


<xs:element name="nombre">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
27/03/2024 19
Exemple 3: anneeFilm borné entre 2000 et 2020
<xsd:simpleType name='anneeFilmType'>
<xsd:restriction base='xsd:integer'>
<xsd:minInclusive value='2000'/>
<xsd:maxInclusive value='2020'/>
</xsd:restriction>
</xsd:simpleType>
<xs:element name="Film" type="anneeFilmType"/>
Exemple 4: Restriction par énumération (1)
Pour limiter l’étendue d'un élément de XML à un ensemble de valeurs acceptables, on a
l’habitude d’utiliser l’énumération : Elément « sexe » avec restriction à "Homme" et "Femme" :
<xs:element name="sexe">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Homme"/>
<xs:enumeration value="Femme"/>
</xs:restriction>
</xs:simpleType>
</xs:element> 20
Exemple 4: Restriction par énumération (2)
<xsd:element name="language" type="LanguageType"/>
<xsd:simpleType name="LanguageType">
<xsd:restriction base="xsd:language">
<xsd:enumeration value="ar"/>
<xsd:enumeration value="en"/>
<xsd:enumeration value="fr"/>
</xsd:restriction>
</xsd:simpleType>
Exemple 4: Restriction par énumération (3)
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
21
</xs:element>
Exemple 5: Restriction: Choix de valeur restreint
❑ On peut également l’écrire comme suit :
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>

❑ Dans ce cas-ci le type "carType" peut être employé par d'autres éléments parce que ce
n'est pas une partie de l'élément "car"
27/03/2024 22
Exemple 6: Restriction par motif
Restrictrion de "letter" à une lettre minuscule :
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
❑ Restriction de "initials" à trois lettres majuscules :
<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
27/03/2024 23
❑ list
L'opérateur xsd:list définit un nouveau type simple dont les valeurs sont les listes
de valeurs du type simple donné par l'attribut itemType.
Il s'agit uniquement de listes de valeurs séparées par des espaces.
Exemple 1:
<xsd:simpleType name="sizes">
<xsd:list itemType="xsd:decimal"/>
</xsd:simpleType>
<xsd:element name="dimensions" type="sizes"/>
Permet d’écrire : <dimensions>2 45 5.6 7.1</dimensions>
Exemple 2: <xsd:simpleType name='listdechaines’>
<xsd:list itemType='xsd:string’/>
</xsd:simpleType>
<xsd:element name="listech" type="listdechaines"/>
Permet d’écrire : <listech> ch1 ch2 ch3 ch4 ch5 </listech>
27/03/2024 24
❑ union

La définition d’un type union se fait en utilisant l’élément xs:union; l’ensemble des
types autorisés est spécifié via l’attribut memberTypes qui lui est associé (la valeur de
l’attribut est une liste de types séparés par des espaces).

L’exemple suivant illustre l’utilisation du mécanisme d’union pour définir un type


autorisant comme valeur indifféremment des entiers ou des dates.

<xs:simpleType name='integerOrDate'>
<xs:union memberTypes='xs:integer xs:date'/>
</xs:simpleType>

27/03/2024 25
Types ou éléments complexes

o Un élément de type simple ne peut pas contenir de sous-éléments, et des attributs,


d’où l’intérêt des éléments complexes.

o Il y a quatre sortes de types complexes :

❖ Type complexe à contenu mixte

❖ Type complexe vide

❖ Type complexe contenant uniquement des éléments

❖ Type complexe à contenu simple

27/03/2024 26
Type complexe avec indicateurs
❑ Les indicateurs permettent de contrôler l’usage des éléments à l’intérieur du type
complexe.
❑ Il existe 7 types d’indicateurs :
Indicateurs d’ordre :
o All
o Choice
o Sequence
Indicateurs d’occurrence :
o maxOccurs
o minOccurs
Indicateurs de groupes :
o Group name
o attributeGroup name
27/03/2024 27
Indicateurs d’ordre
❑ Les indicateurs d’ordre sont employés pour définir comment les éléments devraient
se produire. Indicateur All
❑ L’indicateur all indique que les éléments enfant peuvent apparaître dans n'importe
quel ordre et que chaque élément doit se produire une et une seule fois .
<xs:element name="personne">
<xs:complexType>
<xs:all>
<xs:element name="nom" type="xs:string"/>
<xs:element name="prénom" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
27/03/2024 28
Indicateur Choice
❑ L’indicateur choice Indique qu'un seul parmi les éléments enfants peut se produire
<xs:element name="personne">
<xs:complexType>
<xs:choice>
<xs:element name="employee" type="xs:string"/>
<xs:element name="member" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
Indicateur sequence
❑ Spécifie que les éléments enfants doivent apparaître dans un certain ordre :
<xs:element name="personne">
<xs:complexType>
<xs:sequence>
<xs:element name="prénom" type="xs:string"/>
<xs:element name="nom" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element> 29
Indicateurs d’occurrence
❑ Indicateurs d’occurrence spécifie le nombre de fois un élément peut se produire.

Indicateur maxOccurs
❑ L’indicateur maxOccurs indique le nombre maximum de fois qu’un élément peut se
produire.
<xs:element name="personne">
<xs:complexType>
<xs:sequence>
<xs:element name="nom" type="xs:string" maxOccurs="10"/>
<xs:element name="prenom" type="xs:string" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>

❑ Le nombre d’occurrence minimum par défaut est 1.


30
Indicateur minOccurs
❑ indique le nombre minimum de fois qu’un élément peut se produire.
<xs:element name="personne">
<xs:complexType>
<xs:sequence>
<xs:element name="nom" type="xs:string"/>
<xs:element name="prenom" type="xs:string" maxOccurs="10"
minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>

❑ Pour permettre à un élément d’apparaître un nombre illimité de fois, utiliser un


maxOccurs="unbounded".
27/03/2024 31
Indicateurs de groupe: Group name
❑ Employés pour définir des ensembles relatifs d'éléments.
❑ Groupe d’éléments déclarés par :
<xs:group name="groupname">
...
</xs:group>

❑ On doit définir des all, choice, ou sequence comme un élément d'ordre à l'intérieur
de la déclaration de groupe : l’exemple suivant définit un groupe d’éléments qui
doivent se produire comme une séquence.
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
27/03/2024 32
❑ Après avoir défini un groupe, on peut s’y référer dans un autre groupe ou type
complexe comme ceci :
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:group ref="persongroup"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
27/03/2024 33
Indicateurs de groupe: attributeGroup name

❑ Groupe d’attributs : Défini à l’aide de la déclaration attributeGroup

<xs:attributeGroup name="groupname">
...
</xs:attributeGroup>

Exemple:
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
27/03/2024 34
❑ Une fois défini, on pourra s’y référer dans un autre groupe ou autre type complexe.
Exemple:
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
<xs:element name="person">
<xs:complexType>
<xs:attributeGroup ref="personattrgroup"/>
</xs:complexType>
</xs:element>
27/03/2024 35
Comment définir un élément complexe ?
❑ L'élément "employee" peut être déclaré directement en distinguant ses composants,
comme ceci:
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
❑ Les enfants "firstname" et "lastname" sont entourés de "sequence" les conduisant à
être utilisés dans l’ordre où ils apparaissent.
27/03/2024 36
❑ L'élément "employee" peut avoir un type d’attribut qui se réfère au nom du type
complexe à utiliser :
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>

❑ En utilisant cette méthode :


- Plusieurs éléments peuvent ainsi se référer au type complexe "persoinfo", comme ceci :
<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>
27/03/2024 37
❑ On peut également se baser sur un élément d’un type complexe existant et lui ajouter
des éléments :

<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>

27/03/2024 38
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="addreses" type="xs:string"/>
<xs:element name="ville" type="xs:string"/>
<xs:element name="pays" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="employee" type="fullpersoninfo"/>

❑ "employee" doit contenir dans l'ordre :"firstname", "lastname", "adresse", "ville" et "pays".
27/03/2024 39
Type complexe à contenu mixte
❑ Il peut contenir des attributs, des éléments et du texte.

❑ Exemple : l’élément "letter"

<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>

❑ Notez que le texte qui apparaît entre les éléments "name", "orderid " et "shipdate"
sont tous les enfants de "letter".

27/03/2024 40
❑ Pour permettre au texte d'apparaître entre les enfants-éléments de "letter", l'attribut
mixed doit être à "vrai ".
❑ L'étiquette <xs:sequence> signifie que les éléments définis (name, orderid et
shipdate) doivent apparaître dans cet ordre à l'intérieur d'un élément "letter".

❑ Le texte suivant déclare l’élément "letter " :


<xs:element name="letter">
<xs:complexType mixed="true" >
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
27/03/2024 41
Type complexe vide
❑ Un élément complexe vide ne peut pas avoir de contenu, seulement des attributs.

❑ Exemple (Schéma) :
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>

❑ Exemple (XML) :
<product prodid="1345" />

27/03/2024 42
Type complexe contenant uniquement des éléments
❑ Exemple (Schéma xsd) :
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

❑ Exemple (XML) : <person>


<firstname>TOTO</firstname>
<lastname>TATA</lastname>
</person>
27/03/2024 43
Type complexe à contenu simple
❑ Type complexe à contenu simple : type d’un élément dont le contenu est de type
simple mais qui possède un attribut (un type simple n’a pas d’attribut). On le définit
par une extension ou une restriction d’un type simple par ajout d’un attribut.
❑ Utilisez l'élément extension / restriction pour développer ou limiter le type simple de
base de l'élément.
❑ Exemple (Schéma xsd) :
<xs:complexType name="TypePiece">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="surface-m2" type="xs:decimal"/>
<xs:attribute name="fenetre" type="xs:positiveInteger"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="chambre" type="TypePiece"/>
❑ Exemple (XML) :
<chambre surface-m2="17.5" fenetre="5">Exposition plein sud</chambre> 44
TD1: XSD
Ecrire le fichier schema(.xsd) permettant de valider ce fichier XML ?
<?XML version="1.0" encoding="ISO-8859-1">
<livraisons sxmlns:xsi="[Link]
xsi:noNamespaceSchemaLocation="bonliv_schema" >
<info> association AOTAF </info>
<producteur>coopérative NORD ERFOUD </producteur>
<livraison variete="Mejhoul">
<calibre>30-35 mm</calibre >
<Qte_livree unite="Kilogramme">60</Qte_livree >
<Date_livraison>12/10/2012</Date_livraison>
<intermediaire>BAKADIR Mohamed</intermediaire>
</livraison>
<livraison variete="Feggouss">
<calibre>inférieur à 20 mm</calibre >
<Qte_livrée unite="Quintal">150</Qte_livrée >
<Date_livraison>12/10/2012</Date_livraison>
</livraison>
</livraisons>
27/03/2024 45
TD2: XSD
Ecrire le fichier schema(.xsd) permettant de valider ce fichier XML ?(2014)
<?xml version='1.0' encoding='utf-8' ?>
<facture>
<numfacture>102</numfacture>
<exploitant>
<id>1</id>
<nom>Mohamed lotfi</nom>
<adresse_exp>240 Bd La résistance Errachidia</adresse_exp>
</exploitant>
<terrasses>
<terrasse>
<numero>1</numero>
<zone>B</zone>
<adresse_ter>Nouvelle Targa</adresse_ter>
<superficie unite="m2">20</superficie>
<nbjour>200</nbjour>
27/03/2024 46
<prix unite="Dh/m2">75</prix>
<montant unite="Dh">411</montant>
</terrasse>
<terrasse>
<numero>2</numero>
<zone>A</zone>
<adresse_ter>Boutalamine</adresse_ter>
<superficie unite="m2">30</superficie>
<nbjour>365</nbjour>
<prix unite="Dh/m2">100</prix>
<montant unite="Dh">3000</montant>
</terrasse>
</terrasses>
<total unite="Dh">3411</total>
</facture>

27/03/2024 47
TD3: XSD
Ecrire le code du fichier schéma "[Link] " permettant de valider le fichier XML
"[Link]"?
<?xml version="1.0" encoding="UTF-8"?>
<categories>
<categorie libelle='huile’>
<produit>
<designation> Huile d’olive vierge extra 1/2 litre
</designation>
<prix devise='DH'>100</prix>
<photo>[Link]</photo>
<description> huile rafiné pour assaisonnement
</description>
</produit>
<produit>
<designation> Huile d’olive vierge 1/2 litre
</designation>
27/03/2024 48
<prix devise='DH'>49</prix>
<photo>[Link]</photo>
<description> huile utilisable en generale pour tagine
</description>
</produit>
</categorie>
<categorie libelle='savon’>
<produit>
<designation> savon de marseille 125 GR </designation>
<prix devise='DH'>3</prix>
<photo>[Link]</photo>
</produit>
<produit>
<designation> savon beldi sachet de 25 GR </designation>
<prix devise='DH'>1</prix>
<photo>[Link]</photo>
<description> très bon pour les massages et pour prendre
un bain Turk </description>
</produit>
</categorie> ...
</categories> 49
27/03/2024

Vous aimerez peut-être aussi