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

Valider XML Discussion :

Problème avec la définition d'un namespace.


Sujet :

Valider XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut Problème avec la définition d'un namespace.
    Bonjour,

    Pour un exemple sur une synthèse sur le XML, je souhaite faire un exemple d'utilisation d'un namespace.
    En pièce jointe il y a le fichier xml et xsd. Le fichier dtd ne passe pas en pièce jointe. ci-dessous son code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <!ELEMENT RACINE (DINOSAURE)*>
    <!ATTLIST RACINE
        xsi:noNamespaceSchemaLocation CDATA #IMPLIED
        xmlns:xsi CDATA #IMPLIED
      >
    <!ELEMENT DINOSAURE (NOM, LONGUEUR, CARNIVORE, DECOUVERTE)*>
    <!ELEMENT NOM (#PCDATA)>
    <!ELEMENT LONGUEUR (#PCDATA)>
    <!ELEMENT CARNIVORE (#PCDATA)>
    <!ELEMENT DECOUVERTE (#PCDATA)>
    Ceci fonctionne bien mais je voudrai ajouter un namespace dino sur l'élément racine ou alors sur l'élément dinosaure (<dino:dinosaure>) cf code ci-dessous. Mais je n'y arrive pas. le xml n'est jamais valide. J'ai essayé de changer le dtd mais sans succès également.
    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
     
    <dino:RACINE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="dinosaure2.xsd"
            xmlns:dino="/RACINE">
        <DINOSAURE>
            <NOM>Stegosaure</NOM> 
            <LONGUEUR>10</LONGUEUR>
            <CARNIVORE>0</CARNIVORE>
            <DECOUVERTE>1877-01-01</DECOUVERTE>
        </DINOSAURE>
        <DINOSAURE>
            <NOM>T-Rex</NOM> 
            <LONGUEUR>13</LONGUEUR>
            <CARNIVORE>1</CARNIVORE>
            <DECOUVERTE>1905-01-01</DECOUVERTE>
        </DINOSAURE>    
    </dino:RACINE>
    Pouvez-vous m'aider ?
    Merci par avance de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je n'ai pas lu les pièces jointes, mais si ça aide, je peux le faire plus tard.

    Ceci fonctionne bien mais je voudrai ajouter un namespace dino sur l'élément racine ou alors sur l'élément dinosaure (<dino:dinosaure>) cf code ci-dessous. Mais je n'y arrive pas. le xml n'est jamais valide. J'ai essayé de changer le dtd mais sans succès également.
    Si ceci implique que vous voulez continuer à faire valider via un DTD en utilisant le code existé déjà, vous pouvez faire les changements comme ça :
    Code dtd : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <!ELEMENT dino:RACINE (DINOSAURE)*>
    <!ATTLIST dino:RACINE
        xsi:schemaLocation CDATA #IMPLIED
        xmlns:xsi CDATA #FIXED "http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dino CDATA #IMPLIED
    >
    Le reste, la même.

    Il faut faire attention que hacking dtd pour tenir compte namespace comme ceci, le préfixe est traité d'une façon rigide qui s'aligne mal la fléxibilité du préfixe comme le w3c schéma voulu le rendre.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Merci pour la réponse rapide.
    J'ai modifié le DTD comme spécifié par contre j'ai un mauvais appel du namespace dino dans mon XML. (SchemaLocation : La valeur schemaLocation 'dinosaure2.xsd' doit comporter un nombre pair d'URI. [6]). POur le namespace xsi j'ai bien ma pair (namespace et schéma) par contre pour dino je ne sais pas comment faire. Ou alors je ne me sers pas de "xsi" ? Merci pour votre aide, car je là je bloque vraiment.
    ci-dessous le code xml en cours qui est donc faux.
    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
     
    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE dino:RACINE SYSTEM "dinosaure3.dtd">
    <dino:RACINE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="dinosaure2.xsd"
            xmlns:dino="/RACINE"
    >
        <DINOSAURE>
            <NOM>Stegosaure</NOM> 
            <LONGUEUR>10</LONGUEUR>
            <CARNIVORE>0</CARNIVORE>
            <DECOUVERTE>1877-01-01</DECOUVERTE>
        </DINOSAURE>
        <DINOSAURE>
            <NOM>T-Rex</NOM> 
            <LONGUEUR>13</LONGUEUR>
            <CARNIVORE>1</CARNIVORE>
            <DECOUVERTE>1905-01-01</DECOUVERTE>
        </DINOSAURE>    
    </dino:RACINE>

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    J'ai modifié le DTD comme spécifié par contre j'ai un mauvais appel du namespace dino dans mon XML. (SchemaLocation : La valeur schemaLocation 'dinosaure2.xsd' doit comporter un nombre pair d'URI. [6]). POur le namespace xsi j'ai bien ma pair (namespace et schéma) par contre pour dino je ne sais pas comment faire.
    Ceci ne pose problème que si, au lieu de valider par le dtd, vous validez le xml pas le schema xsd. Pour une validation via dtd, l'engin validant est bien aveugle à la syntaxe de xsi:schemaLocation au sens de validation via xsd. C'est pour ça, CDATA est mis pour "l'attribut" xsi:schemaLocation. Ceci etant dit, si vous voulez savoir ce que c'est passé pour une validation via xsd, la syntaxe de cette declaration serait comme ça :
    Code xsd : Sélectionner tout - Visualiser dans une fenêtre à part
    xsi:schemaLocation="/RACINE dinosaure2.xsd"
    qui tôt ou tard exige quelque travail sur leur résolution par l'application elle-même... mais c'est une autre histoire.

    Ou alors je ne me sers pas de "xsi" ?
    Si vous entendez dire mettre schemaLocation sans prefixe xsi, alors non. Il faut l'y mettre. Si vous entendez dire de spécifier le xsd pour xsi dans la valeur de xsi:schemaLocation, la réponse est aussi non - mais cette fois, c'est que ce n'est pas nécessaire. Le schéma pour le namespace xsi est built-in et il n'y a pas le besoin d'y mettre quoi que ce soit.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Avec vos explications j'ai réussi à valider mon XML mais la syntaxe que j'ai faite me semble étrange. Pouvez-vous me dire si c'est écrit de façon "standard" car c'est pour passer un oral. je ne voudrais pas que ce soit tordu car je ne fais plus d'appelle à l'addresse : "http://www.w3.org/2001/XMLSchema-instance" et dans tous les exemples que ej vois il y a cet appel.
    Le code de mon xml :
    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
     
    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE dino:RACINE SYSTEM "dinosaure3.dtd">
    <dino:RACINE xmlns:dino="dinosaure2.xsd" 
            dino:schemaLocation="/RACINE dinosaure2.xsd"
    >
        <DINOSAURE>
            <NOM>Stegosaure</NOM> 
            <LONGUEUR>10</LONGUEUR>
            <CARNIVORE>0</CARNIVORE>
            <DECOUVERTE>1877-01-01</DECOUVERTE>
        </DINOSAURE>
        <DINOSAURE>
            <NOM>T-Rex</NOM> 
            <LONGUEUR>13</LONGUEUR>
            <CARNIVORE>1</CARNIVORE>
            <DECOUVERTE>1905-01-01</DECOUVERTE>
        </DINOSAURE>    
    </dino:RACINE>
    Le code de mon dtd:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <!ELEMENT dino:RACINE (DINOSAURE)*>
    <!ATTLIST dino:RACINE
        dino:schemaLocation CDATA #IMPLIED
        xmlns:dino CDATA #IMPLIED
    >
    <!ELEMENT DINOSAURE (NOM, LONGUEUR, CARNIVORE, DECOUVERTE)*>
    <!ELEMENT NOM (#PCDATA)>
    <!ELEMENT LONGUEUR (#PCDATA)>
    <!ELEMENT CARNIVORE (#PCDATA)>
    <!ELEMENT DECOUVERTE (#PCDATA)>
    Merci pour votre aide.

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Pouvez-vous me dire si c'est écrit de façon "standard" car c'est pour passer un oral. je ne voudrais pas que ce soit tordu car je ne fais plus d'appelle à l'addresse : "http://www.w3.org/2001/XMLSchema-instance" et dans tous les exemples que ej vois il y a cet appel.
    C'est bien que vous le dites en avant parce que je ne veux personne raté un examin ou oral. Je peux élaborer plus.

    Ce n'est pas un problème apriori que vous écrivez le xml comme tel en tant qu'un exemple. A fin de compte, tous xml documents sont spéciaux, dont extensible (le x de xml) à condition que vous ne expliquez pas trop quoi il représente. Mais, non, ce n'est pas bon ce que vous finalement tombez dessus. Il ne faut pas faire ça en particulier pour un examin parce que ça trahie votre ignorance trop.

    D'ailleurs, je ne comprends pas pourquoi vous impliquez que le xml avec les modifications j'ai apportées ne se valide pas. C'est presque impossible.

    La forme finale pose beaucoup de problème.
    <dino:RACINE xmlns:dino="dinosaure2.xsd"
    dino:schemaLocation="/RACINE dinosaure2.xsd"
    >
    On devrait déduire vous ne saissirez pas trop la notion de déclaration de namespace et ce qu'on fait avec xsi:schemaLocation. (Mais vous faites dino:schemaLocation, vous pouvez en sortir parce que personne ne sait quoi qu'il signifie.)

    A l'origine, /RACINE est ce qu'on appelle le nom de namespace en question. Et soudain, vous écrivez xmlns:dino=''dinosaure2.xsd". Maintenant, le nom de namespace devient dinosaure2.xsd. Vous avez plein de droit de le faire. Mais, si par ignorance vous entendez dino:schemaLocation sémantique xsi:schemaLocation, ceci pose un problème grave, même une erreur. J'emploi nom de namespace et pas uri de namespace, parce que les differentes formes montrées sont toutes de sorte de uri-reference, ça pose problème de "compliance". C'est une histoire très compliquée et obscure: il vaut mieux éviter ce genre d'issue pour un examin. Je propose vous utilisez http://example.com officiellement libre pour tous à utiliser comme le uri de namespace pour contourner le détail assez difficile à expliquer.

    Je n'ai pas assez du temps (je peux revenir quand je suis plus libre), bref, voici la forme que je propose utiliser pour éviter toute sorte de questionnement difficile.
    Code xml : 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
    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE dino:RACINE SYSTEM "dinosaure3.dtd">
    <dino:RACINE xmlns:dino="http;//example.com"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://example.com dinosaure2.xsd"
    >
        <DINOSAURE>
            <NOM>Stegosaure</NOM> 
            <LONGUEUR>10</LONGUEUR>
            <CARNIVORE>0</CARNIVORE>
            <DECOUVERTE>1877-01-01</DECOUVERTE>
        </DINOSAURE>
        <DINOSAURE>
            <NOM>T-Rex</NOM> 
            <LONGUEUR>13</LONGUEUR>
            <CARNIVORE>1</CARNIVORE>
            <DECOUVERTE>1905-01-01</DECOUVERTE>
        </DINOSAURE>    
    </dino:RACINE>

    Et puis dinosaure3.dtd
    Code dtd : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!ELEMENT dino:RACINE (DINOSAURE)*>
    <!ATTLIST dino:RACINE
        xsi:schemaLocation CDATA #IMPLIED
        xmlns:xsi CDATA #FIXED "http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dino CDATA #IMPLIED
    >
    <!ELEMENT DINOSAURE (NOM, LONGUEUR, CARNIVORE, DECOUVERTE)*>
    <!ELEMENT NOM (#PCDATA)>
    <!ELEMENT LONGUEUR (#PCDATA)>
    <!ELEMENT CARNIVORE (#PCDATA)>
    <!ELEMENT DECOUVERTE (#PCDATA)>

    Et au plan de forme, ça devrait impeccable, ou presque.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    oui enfin si c'est pour un oral, on n'a pas fini.

    Commençons par quelques vérités générales :

    - Les DTD ne gèrent pas vraiment les namespaces. On ne peut donc pas avoir une validation très efficace en utilisant des DTD sur des document à namespace. Quand on utilise des namespaces il vaut mieux XSD. Ça se voit que DTD ne gère pas : en mettant en dur des dino:RACINE et des xmls:dino dans la DTD, alors que dino n'est qu'un préfixe qui a le droit de changer d'un document à l'autre et pourrait être remplacé par toto ou zorglub.

    - DTD et XSD sont des systèmes de validation indépendants. On peut utiliser soit l'un, soit l'autre, on peut aussi utiliser les deux en même temps si on en a envie mais ça ne sert à rien et ils n'agissent pas l'un sur l'autre.

    - le DOCTYPE c'est pour utiliser la validation DTD. Le xmlnssi c'est pour utiliser la validation XSD.

    Maintenant voyons ce qu'on peut améliorer dans le détail :

    - Effectivement, un namespace c'est une URI, donc quand on choisit d'utiliser un namespace il faut pas quelque chose comme "/RACINE" mais plutôt quelque chose comme "http://lhonolulu.org/dinosaures". C'est quand même beaucoup plus l'esprit de la chose.

    - Quand on utilise des namespaces, ça n'a pas de sens d'en mettre un juste sur la racine et pas sur les autres éléments. C'est quoi l'intérêt, ça veut dire quoi, comment on explique une telle décision ? Non, ce serait beaucoup plus logique de le mettre sur tous les éléments.

    Du coup ça ressemblera à :

    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
    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE dino:RACINE SYSTEM "dinosaure3.dtd">
    <dino:RACINE xmlns:dino="http://example.com"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://example.com dinosaure2.xsd"
    >
        <dino:DINOSAURE>
            <dino:NOM>Stegosaure</dino:NOM> 
            <dino:LONGUEUR>10</dino:LONGUEUR>
            <dino:CARNIVORE>0</dino:CARNIVORE>
            <dino:DECOUVERTE>1877-01-01</dino:DECOUVERTE>
        </dino:DINOSAURE>
        <dino:DINOSAURE>
            <dino:NOM>T-Rex</dino:NOM> 
            <dino:LONGUEUR>13</dino:LONGUEUR>
            <dino:CARNIVORE>1</dino:CARNIVORE>
            <dino:DECOUVERTE>1905-01-01</dino:DECOUVERTE>
        </dino:DINOSAURE>    
    </dino:RACINE>
    Sauf que répéter tous ces dino: ça commence à être verbeux sans être utile. Ça se fait souvent dans certains formats comme XSD ou XSL mais ça s'évite dans la plupart.
    De plus la mode et l'appréciation de la lisibilité sont plutôt aux éléments en minuscule, pas en majuscule.
    carnivore : 0 ou 1 c'est nul, il vaut mieux remplacer par quelque chose d'explicite.
    Enfin, "racine" c'est tout pourri comme nom, il vaut mieux par exemple "dinosaures".
    Donc :

    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
    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE dinosaures SYSTEM "dinosaure3.dtd">
    <dinosaures xmlns="http://example.com"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://example.com dinosaure2.xsd"
    >
        <dinosaure>
            <nom>Stegosaure</nom> 
            <longueur>10</longueur>
            <regime>herbivore</regime>
            <decouverte>1877-01-01</decouverte>
        </dinosaure>
        <dinosaure>
            <nom>T-Rex</nom> 
            <longueur>13</longueur>
            <regime>carnivore</regime>
            <decouverte>1905-01-01</decouverte>
        </dinosaure>    
    </dinosaures>
    et là ça commence à ressembler à du XML.

    Éventuellement, les accents dans les noms de balises, il vaut mieux éviter, mais il en faudrait peut-être un à Stégosaure.
    Du coup qui dit accent dit encodage, donc penser à enregistrer le fichier en utf-8.
    Et à parler du fait que cela est géré proprement, on aurait pu écrire <?xml version="1.0" encoding="utf-8" standalone="no"?> pour montrer clairement que c'est de l'utf-8 mais de toute façon utf-8 est pris par défaut si on précise rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    - Quand on utilise des namespaces, ça n'a pas de sens d'en mettre un juste sur la racine et pas sur les autres éléments. C'est quoi l'intérêt, ça veut dire quoi, comment on explique une telle décision ? Non, ce serait beaucoup plus logique de le mettre sur tous les éléments.
    Non, ce n'est pas vrai. Je ne dis pas c'est fait dans la majorité des cas, mais c'est loins d'être de rarement vu. On s'en serve assez souvent pour être remarqué dans les payloads des services web soap et pas que non plus. Bon ou mauvais? ce n'est pas une question pertinente.

    En termes plus techniques, il suffit d'écrire un @elementFormDefault unqualified (défaut, d'ailleurs) et n'écrire que l'élément racine comme top-level élément et tous les enfants en forme locale; ou bien avec un xs:import un xsd extérieur sans targetNamespace pour définir les enfants. En tout cas, ce n'est même pas une règle méritante et ça risque d'impringer une fausse impression pour les débutants ou les lecteurs insourcieux.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Merci à tous les deux pour vos réponses. Avec vos précisions j'ai scindé mes exemple, un pour le dtd et deux pour le xsd (avec et sans namespace).
    Pour le DTD c'est OK. POur le XSD sans NameSpace OK. Et on revient toujours à ce namespace qui ne passe pas...
    J'ai l'erreur suivante : cvc-elt.1: Cannot find the declaration of element 'dino:dinosaures'. Vous savez ce qui cloche ? Ca fait 1h30 que je tourne en rond là dessus...

    code xml :
    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
     
    <?xml version="1.0" standalone="no"?>
    <dino:dinosaures xmlns:dino="http://example.com/dinosaures"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://example.com dinosaure3.xsd"
    >
        <dinosaure>
            <nom>Stegosaure</nom> 
            <longueur>10</longueur>
            <carnivore>0</carnivore>
            <decouverte>1877-01-01</decouverte>
        </dinosaure>
        <dinosaure>
            <nom>T-Rex</nom> 
            <longueur>13</longueur>
            <carnivore>1</carnivore>
            <decouverte>1905-01-01</decouverte>
        </dinosaure>    
    </dino:dinosaures>
    code du xsd :
    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
     
    <?xml version="1.0"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:complexType name="dinosaures">
            <xs:sequence>
                <xs:element name="dinosaure">     
                    <xs:complexType>       
                        <xs:sequence>   
                            <xs:element name="nom"          type="xs:string"/>   
                            <xs:element name="longueur"     type="xs:integer"/>   
                            <xs:element name="carnivore"    type="xs:boolean"/>   
                            <xs:element name="decouverte"   type="xs:date"/>       
                        </xs:sequence>     
                    </xs:complexType> 
                </xs:element> 
            </xs:sequence>
        </xs:complexType> 
    </xs:schema>

  10. #10
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    [1]
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <dino:dinosaures xmlns:dino="http://example.com/dinosaures"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://example.com dinosaure3.xsd"
    >
    Ce n'est pas une erreur en soi. Mais si ça donne quelque instruction utile à l'engin validant, les namespaces apparus à deux endroits doient être d'accord.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <dino:dinosaures xmlns:dino="http://example.com/dinosaures"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://example.com/dinosaures dinosaure3.xsd"
    >
    [2] Et puis le xsd. L'élément dinosaures est défini dans le namespace http://eample.com/dinosaures, le but primal du xsd en question.
    [2.1] D'abord il est un élément pas vraiment un type complex comme écrit - ça peut le faire explicitant un complexType nommé, mais pas de la façon comme montrée.
    [2.2] Deuxièmement, pour bien déclarer que le namespace soit celà et mais les autres, il faut dire via l'attribut targetNamespace.
    [2.3] Dinosaure peut se répéter : c'est a dire avec un facet de cardinalité (maxOccurs) plus qu'un; normalement on met "unbounded" pour être plus commode et pour la performance.
    Code xml : 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
    <?xml version="1.0"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://example.com/dinosaures"
        elementFormDefault="unqualified"
    >
        <xs:element name="dinosaures">
          <xs:complexType>
            <xs:sequence>
                <xs:element name="dinosaure" maxOccurs="unbounded">     
                    <xs:complexType>       
                        <xs:sequence>   
                            <xs:element name="nom"          type="xs:string"/>   
                            <xs:element name="longueur"     type="xs:integer"/>   
                            <xs:element name="carnivore"    type="xs:boolean"/>   
                            <xs:element name="decouverte"   type="xs:date"/>       
                        </xs:sequence>     
                    </xs:complexType> 
                </xs:element> 
            </xs:sequence>
          </xs:complexType>
        </xs:element>
    </xs:schema>
    [2.4] J'ajoute un attribut elementFormDefault="unqualified" qui est par défaut - c'est à dire vous pouvez l'épargner sans rien explicité. Mais pour celui qui n'est pas encore très à l'aise avec xsd, ça aide à la compréhension. Comme ça, tous les enfants sont vécus dans un namespace null, càd sans namespace, bien en accord avec l'instance de xml en question.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Bonjour,

    Merci beaucoup à vous deux pour le temps passé à bien m'expliquer. Je ne suis pas (encore...) un champion du XML mais ça commence à rentrer.
    Le dernier exemple fonctionne parfaitement.

    Par contre quand je veux mettre le namespace dino sur les balises contenu dans dinosaures j'ai le message d'erreur : cvc-complex-type.2.4.a : Contenu non valide trouvé à partir de l'élément 'dino:dinosaure'. L'une des valeurs '{dinosaure}' est attendue. [6]
    Je ne comprends pas vu que toutes mes balises sont comprises dans "dinosaures". Le namespace doit donc pouvoir s'appliquer ?

    code xml :
    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
     
    <?xml version="1.0" standalone="no"?>
    <dino:dinosaures 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://example.com/dinosaures dinosaure3.xsd"
        xmlns:dino="http://example.com/dinosaures">
        <dino:dinosaure>
            <dino:nom>Stegosaure</dino:nom> 
            <dino:longueur>10</dino:longueur>
            <dino:carnivore>0</dino:carnivore>
            <dino:decouverte>1877-01-01</dino:decouverte>
        </dino:dinosaure>
        <dino:dinosaure>
            <dino:nom>T-Rex</dino:nom> 
            <dino:longueur>13</dino:longueur>
            <dino:carnivore>1</dino:carnivore>
            <dino:decouverte>1905-01-01</dino:decouverte>
        </dino:dinosaure>    
    </dino:dinosaures>
    Encore merci !

  12. #12
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Par contre quand je veux mettre le namespace dino sur les balises contenu dans dinosaures j'ai le message d'erreur : cvc-complex-type.2.4.a : Contenu non valide trouvé à partir de l'élément 'dino:dinosaure'. L'une des valeurs '{dinosaure}' est attendue. [6]
    Si vous voulez faire ça, il suffit de change la valeur de elementFormDefault de unqualified (par défaut aussi) à qualified. Ce n'est pas par caprice ou par vanité que j'ai pris temps sur ce sujet dans les posts précédants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <dino:dinosaures 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://example.com/dinosaures dinosaure3.xsd"
        xmlns:dino="http://example.com/dinosaures"
        elementFormDefault="qualified"
    >

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Merci pour tout ce temps passé. Cela fonctionne parfaitement.
    Je n'avais pas compris comme ça l'option unqualified "En termes plus techniques, il suffit d'écrire un @elementFormDefault unqualified (défaut, d'ailleurs) et n'écrire que l'élément racine comme top-level élément et tous les enfants en forme locale;". Au moins avec l'erreur ca m'a bien montré l'utilité.
    Encore merci car sans vous je n'y serai sans doute pas arrivé !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/09/2010, 14h33
  2. [AC-2003] Problème avec la définition du format d'un champs par le code
    Par yonnel dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/07/2010, 18h16
  3. [XL-2003] Problème avec la définition d'une plage de données
    Par coklin dans le forum Excel
    Réponses: 1
    Dernier message: 15/01/2010, 18h18
  4. [XL-2003] Problème avec la définition des axes d'un ScatterMarkers avec OWC10
    Par ankoubzh dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/05/2009, 22h15
  5. [ActiveX Acrobat] Problème avec la définition du CLSID / EVENTID
    Par SubZero2 dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 19/09/2005, 08h54

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