1. #1
    Membre régulier
    Homme Profil pro
    IT in outer space
    Inscrit en
    novembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : novembre 2006
    Messages : 84
    Points : 90
    Points
    90

    Par défaut Eclipse propose la completion selon le schema mais dit que l'attribut définit dans une balise est interdit.

    Bonjour,

    je suis en train d'apprendre XML Schema avec un livre et le cours d'un MOOC bien connu qui propose de faire un TP et je rencontre des erreurs que je ne comprends pas sous Eclipse.

    Voici le code que j'ai écrit pour le moment (j'ai recommencé du début et j'y vais par étapes). Je me concentre pour le moment sur la définition d'une balise <email /> contenu dans une autre balise <emails />.
    <email /> contient du texte (pour le moment pas de pattern juste un xsd:string) et un attribut qui prend une valeur parmi certaines énumérées. J'ai tendance à décomposer le code autant que possible par souci de modularité.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/repertoire" 
        xmlns:tns="http://www.example.org/repertoire" 
        elementFormDefault="qualified">
     
        <!-- DEFINITION -->
     
        <!-- EMAILS -->
     
     
        <xsd:simpleType name="contactType">
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="personnel"></xsd:enumeration>
                <xsd:enumeration value="professionnel"></xsd:enumeration>
            </xsd:restriction>
        </xsd:simpleType>
     
     
     
        <xsd:complexType name="emailType">
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute ref="tns:type"></xsd:attribute>
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
     
     
     
     
     
     
        <xsd:attribute name="type" type="tns:contactType"></xsd:attribute>
     
     
        <xsd:complexType name="emailsType">
            <xsd:sequence>
                <xsd:element ref="tns:email" minOccurs="0" maxOccurs="unbounded"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
     
     
        <xsd:element name="email" type="tns:emailType"></xsd:element>
     
     
        <xsd:element name="emails" type="tns:emailsType"></xsd:element>
     
     
        <xsd:complexType name="personneType">
            <xsd:sequence>
                <xsd:element ref="tns:emails" maxOccurs="1" minOccurs="0"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
     
     
        <xsd:element name="personne" type="tns:personneType"></xsd:element>
     
     
        <xsd:element name="repertoire" type="tns:repertoireType"></xsd:element>
     
        <xsd:complexType name="repertoireType">
            <xsd:sequence>
                <xsd:element ref="tns:personne" maxOccurs="unbounded" minOccurs="0"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>
    Voici un morceau du code donné en solution.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
        <!-- balise email -->
        <xsd:element name="email">
            <xsd:complexType>
                <xsd:simpleContent>
                    <xsd:extension base="xsd:string">
                        <xsd:attribute name="type">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:enumeration value="personnel" />
                                    <xsd:enumeration value="professionnel" />
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:attribute>
                    </xsd:extension>
                </xsd:simpleContent>
            </xsd:complexType>
        </xsd:element>
     
     
        <!-- balise emails -->
        <xsd:element name="emails">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element ref="email" maxOccurs="unbounded" />
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    Voici un morceau de code XML que j'ai écrit pour tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?><tns:repertoire xmlns:tns="http://www.example.org/repertoire" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/repertoire repertoire.xsd ">
        <tns:personne>
            <tns:emails>
                <tns:email type="personnel">test@perso.com</tns:email>
                <tns:email type="professionnel">test@pro.com</tns:email>
            </tns:emails>
        </tns:personne>
    </tns:repertoire>
    Si je suis correct on respecte globalement la même structure


    email est défini dans la solution par:
    element > complexType > simpleContent > extension >attribute > simpleType > restriction > enumeration{2}


    De mon côté je fais:


    email > element type(emailType)


    emailType > complexType > simpleContent > extension > attribute ref(type)


    type type(contactType)


    contactType > simpleType > restriction > enumeration{2}

    Si on rassemble le tout on a bien la même chose que dans la solution qui marche. Alors pourquoi quand j'écris mon fichier XML, Eclipse me dit que je n'ai pas le droit d'écrire d'attribut type alors que l'IDE me propose bien l'auto-completion ? Qu'est-ce qui m'échappe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cvc-complex-type.3.2.2: Attribute 'type' is not allowed to appear in element 'tns:email'. test.xml /XML/xml line 5 XML Problem
    Merci.

  2. #2
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 092
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 092
    Points : 1 893
    Points
    1 893

    Par défaut

    J'ai tendance à décomposer le code autant que possible par souci de modularité.
    C'est très bien, mais il faut faire avec un esprit tempéré, une sélection judicieuse, pas trop pour un seul but de formalisme têtu...

    Le problème ici, c'est que vous faites ceci (ligne #25)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsd:attribute ref="tns:type"></xsd:attribute>
    Cela s'implique que l'attribut nommé type, étant s'écrire comme une élément global d'un schema d'un targetNamespace http://www.example.org/repertoire, il, pour ainsi s'acquérir un namespace non-null.

    Comme tel, les instances de document xml, valident par ce schema serait ça:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <tns:repertoire xmlns:tns="http://www.example.org/repertoire" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/repertoire repertoire.xsd">
        <tns:personne>
            <tns:emails>
                <tns:email tns:type="personnel">test@perso.com</tns:email>
                <tns:email tns:type="professionnel">test@pro.com</tns:email>
            </tns:emails>
        </tns:personne>
    </tns:repertoire>
    Faite attention au préfixe du @tns:type.

    Pour valider l'instance du document xml original, le plus simple à faire, c'est de mettre la définition du @type local sans pourtant sacrifier le travail et l'idée sur le type contactType dans le namespace http://www.example.org/repertoire.
    Code xsd : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    <!--
                    <xsd:attribute ref="tns:type"></xsd:attribute>
                    -->
                    <xsd:attribute name="type" type="tns:contactType"></xsd:attribute>
    Voilà et c'est fait.

  3. #3
    Membre régulier
    Homme Profil pro
    IT in outer space
    Inscrit en
    novembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : novembre 2006
    Messages : 84
    Points : 90
    Points
    90

    Par défaut

    Wow ! Je n'avais pas idée qu'il faille préfixer avec tns jusqu'aux attributs. Je me doutais que ça serait bidon mais j'arrivais pas à comprendre.

    Si j'ai créé le contactType c'est parce que dans le schema il y a aussi une balise telephone avec le même attribut type qui contient la même énumération.

    Je viens d'essayer l'autre solution proposée et le préfixe n'est plus demandé. Du coup c'est moins verbeux.
    Merci pour l'aide.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 275
    Points : 19 104
    Points
    19 104

    Par défaut

    L'usage est de préférer les attributs sans préfixe, à moins qu'il y ait une bonne raison.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2016, 00h32
  2. Réponses: 10
    Dernier message: 28/12/2015, 23h58
  3. Réponses: 11
    Dernier message: 24/02/2010, 16h07
  4. [Eclipse] Java Auto Completion
    Par newic500 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/11/2007, 20h15
  5. Créer des droits de lecture de schema mais pas de données
    Par Louis-Guillaume Morand dans le forum MS SQL-Server
    Réponses: 1
    Dernier message: 07/10/2007, 21h50

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