IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML/XSL et SOAP Discussion :

[XSD] ComplexType [Débutant(e)]


Sujet :

XML/XSL et SOAP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut [XSD] ComplexType
    Bonsoir,

    j'essaie de comprendre comment ça marche (le XSD)
    alors voilà j'ai écrit deux petits exemples, le xml d'abord puis le xsd correspondant (généré par un logiciel mais je dois le remodifier ensuite).

    Si vous pouviez me dire si c'est correct ce serait sympa.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- ************************ 1er exemple ************************* -->
    <!-- xml -->
    <test attr1="type1" attr2="type2"/>
     
    <!-- xsd -->
    <xs:element name="test" minOccurs="0" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="attr1" type="xs:string" use="required" />
        <xs:attribute name="attr2" type="xs:string" use="required" />
      </xs:complexType>
    </xs:element>
    Jusqu'ici je comprends.

    Mais là ça se complique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <!-- ************************ 2ème exemple ************************ -->
    <!-- xml -->
    <testTime name="type1">04:30:00</testTime>
    <testTime name="type2">03:00:00</testTime>
    <testTime name="type3">00:25:00</testTime>
     
    <!-- xsd -->
    <xs:element name="testTime" minOccurs="0" maxOccurs="3">
      <xs:complexType>
        <xs:simpleContent>
    	  <xs:extension base="xs:time">
    	    <xs:attribute name="name" type="xs:string" use="required" />
    	  </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
    </xs:element>
    Pourquoi a-t-il besoin de mettre un xs:extension ?
    ça me perturbe un peu ça, il n'y aurait pas moyen de faire sans ?

    Merci.
    Bonne soirée.

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    comme tu peux le remarquer, ton élément a un contenu typé simple et un attribut qui le rend complexe. c'est pourquoi pour passer d'un contenu simple à un type complexe on est obligé de passer par dérivation

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut
    Merci de ta réponse mais ça ne m'éclaire pas beaucoup,
    pourquoi ne suffit-il pas de mettre ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <!-- xml -->
    <testTime name="type1">04:30:00</testTime>
    <testTime name="type2">03:00:00</testTime>
    <testTime name="type3">00:25:00</testTime>
     
    <!-- xsd -->
    <xs:element name="testTime" type="xs:time" minOccurs="0" maxOccurs="3">
      <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="required" />
      </xs:complexType>
    </xs:element>
    Ou même encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <!-- xml -->
    <testTime name="type1">04:30:00</testTime>
    <testTime name="type2">03:00:00</testTime>
    <testTime name="type3">00:25:00</testTime>
     
    <!-- xsd -->
    <xs:element name="testTime" type="xs:time" minOccurs="0" maxOccurs="3">
      <xs:attribute name="name" type="xs:string" use="required" />
    </xs:element>
    Je ne vois pas bien ce que l'on perd comme information en faisant comme ça ?
    Et ça évite d'utiliser le xs:extension qui n'est pas très clair pour moi.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 300
    Points
    300
    Par défaut
    Il vaux mieux fonctionner à l'envers, qu'est ce que signifierait écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xs:element name="testTime" type="xs:time" minOccurs="0" maxOccurs="3">
      <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="required" />
      </xs:complexType>
    </xs:element>
    ton élément testTime est de type xs:time mais de type complextype aussi, un élément ne peux avoir qu'un seul type sinon cela deviendrait ingérable. Il faut donc partir de son contenu qui est simple puis le dériver en complexe pour avoir l'attribut, on garde sa caractéristique de base sans perdre sa complexité. Cela reste un cas particulier, il a été traité ainsi dans la spec, il faut appliquer sans trop se poser de question car pour ma part je trouve que la division en contenu simple & complexe a été une erreur, une composante text comme en relaxNG typable réglait le problème...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut
    Ah OK je comprends mieux, j'avais pas saisi que le xs:complexType pouvait être en conflit avec type="xs:time"
    j'avais pas fait le lien.


    Sinon j'ai une autre question concernant les xs:sequence, xs:all et xs:choice
    j'ai trouvé de la documentation et il est dit que :
    xs:sequence : tous les éléments doivent apparaître dans l'ordre.
    xs:all : tous les éléments doivent apparaître pas forcément dans l'ordre.
    xs:choice : un seul des élements doit apparaître.

    Mon problème est qu'aucun de ces cas ne me convient !
    J'aurais besoin de définir des élements qui ne doivent pas forcément "tous" apparaître et pas forcément dans l'ordre.

    J'ai vu sur internet un exemple où ils ajoutent des minOccurs="0" pour chacun des éléments enfants,
    mais j'ai l'impression que ce n'est pas compatible avec la première définition du xs:all qui est que "TOUS les élements doivent apparaître" :

    ça donnerait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- xml -->
    <elements>
      <element1 name="type1">04:30:00</testTime>
      <element2 name="type2">147</testTime>
      <element3 name="type3">toto</testTime>
    </elements>
     
    <!-- xsd -->
    <xs:element name="test">
      <xs:complexType>
    	<xs:all>
    	  <xs:element name="element1" type="xs:time" minOccurs="0"/>
    	  <xs:element name="element2" type="xs:integer" minOccurs="0"/>
    	  <xs:element name="element3" type="xs:string" minOccurs="0"/>
    	</xs:all>
      </xs:complexType>
    </elements>
    Et sinon mon générateur de xsd me fait un mixe entre xs:sequence et xs:choice
    et ça me rend ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xs:element name="elements" >
      <xs:complexType>
    	<xs:sequence>
    	  <xs:choice maxOccurs="unbounded">
    		<xs:element name="element1" type="xs:time" />
    		<xs:element name="element2" type="xs:integer" />
    		<xs:element name="element3" type="xs:string" />
    	  </xs:choice>
    	</xs:sequence>
      </xs:complexType>
    </xs:element>
    Du coup je ne sais pas trop comment faire ...

    Je veux juste définir un élément qui contiendrait des élements enfants, lesquels ne sont pas obligés d'apparaître et ne sont pas obligés d'êtres dans l'ordre.

    Si vous avez une idée merci beaucoup.

    Bonne journée.


    [EDIT]

    Ah sinon je viens de trouver ça sur internet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="3">
        <xs:element name="element1" type="xs:time"/>
        <xs:element name="element2" type="xs:integer"/>
    	<xs:element name="element3" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    si je remplace les 'sequence' par 'all' ça peut peut-être répondre à mon problème, enfin logiquement ça devrait nan ?

Discussions similaires

  1. JAXB namespace depuis un XSD avec complexType anonyme ?
    Par pcouas dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 17/07/2012, 19h54
  2. [XSD] complexType mixed
    Par sanzero dans le forum Valider
    Réponses: 9
    Dernier message: 10/12/2010, 11h49
  3. [XSD] faire un complexType
    Par sanchou dans le forum Valider
    Réponses: 4
    Dernier message: 25/06/2007, 15h13
  4. Fichiers xsd
    Par moxnico dans le forum Valider
    Réponses: 3
    Dernier message: 14/08/2002, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo