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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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

+ 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