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 :

[xsd][Java] Utilité de xsi:schemaLocation ?


Sujet :

Valider XML

  1. #1
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut [xsd][Java] Utilité de xsi:schemaLocation ?
    Bonjour, j'essaie de faire valider un xml en java. Lorsque mon xml ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <personList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.health.fgov.be/person http://www.health.fgov.be/person"
    xmlns="http://www.health.fgov.be/person"/>
    Le processus de validation est bien enclenché, j'obtiens " cvc-complex-type.4: Attribute 'id' must appear on element 'personList'.", ce qui est bien le résultat souhaité. Cependant je me pose des questions quand à l'utilité de cette double déclaration xsi=schemaLocation, qui fait pointer le schéma sur lui même.


    Si je la retire, et que je finis donc avec ce xml ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8"?>
    <personList xmlns="http://www.health.fgov.be/person"/>
    Le comportement est différent, j'obtiens "cvc-elt.1: Cannot find the declaration of element 'personList'", ce qui n'est pas le comportement voulu. Quelqu'un peut-il m'expliquer pourquoi cette déclaration xsi est indispensable? J'ai trouvé des tas d'exemple de xml sur le net ou l'on mettait seulement le namespace dans la déclaration et ca sufissait, par toute cette tartine de xsi.

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Parce que cela n'a rien à voir

    la ou il doit chercher le schema

    signale l'utilisation de xml schema 1.0


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns="http://www.health.fgov.be/person"/
    espace de nom des balises qui suivent

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu peux détaille un peux? Pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <personList xmlns="http://www.health.fgov.be/person"/>
    n'est pas valide alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <personList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.health.fgov.be/person http://www.health.fgov.be/person"
    xmlns="http://www.health.fgov.be/person"/>
    est valide? J'ai du mal a saisir. Pour moi ce schemaLocation n'apporte aucune information.

    J'ai déjà vu plein de fois par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html xmlns="http://www.w3.org/1999/xhtml">
    ....
    </html>
    Aucun xsi dans l'histoire.

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html xmlns="http://www.w3.org/1999/xhtml">
    ....
    </html>
    parce qu'ici il n'y a aucune validation d'effectué .

    Ne confonderais tu pas bien formé et validation ???

    Pour validé un document il faut lui ajoindre un xml schema ce que fait xsi:schemaLocation .

    L'espace de nom (xmlns) ne fait que donné une "identité" aux balises concernés.L'utilité des espaces de nom est un autre débat...


    edit: est ce que par hasard tu joindrais ton xml schema via une API ?

    Parce que dans ce cas là, ton xml utilise peut être deux schema de validation.
    Celle que tu ajoute via l'API plus celle pointé par le xsi:schemalocation .De ce point de vue d'ailleurs, la validation ne concernerait peut être pas la totalité du document
    Je n'ai aucune idée sur les priorités dans ce cas là

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je fait la validation par une API. Api a laquelle je fournis un catalogue, qui mappe bien le publicId:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <catalog
      xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
     
      <system systemId="http://www.health.fgov.be/person"
        uri="medex.person.xsd"/>
     
      <public publicId="http://www.health.fgov.be/person"
        uri="medex.person.xsd"/>
    </catalog>
    Ce qui m'ennuie c'est que, à aucun moment, l'api ne demande au catalogue "à quoi correspond "http://www.health.fgov.be/person" "? Elle considère comme un fait acquis que ce namespace n'est pas resolvable. Je trouve ça extrèmement dérangeant.

    Et à mettre les schema information j'ai l'impression à la fois de surcharger le xml, mais aussi que ca va poser des problème quand mon destinataire va vouloir valider le document (le systemId pointé dans le xml est totalement arbitraire, le ficheir xsd n'étant sur aucun serveur public, d'ou mon utilisation d'un catalogue.

    De plus, tu sous entends là (et ca me dérange encore plus) qu'il est impossible de valider un document xml correctement formé si il n'inclu pas les directive xsi? Donc au final, que le xml sorti par des tas d'outils déjà existant (inkscape par exemple) est invalide?

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    De plus, tu sous entends là (et ca me dérange encore plus) qu'il est impossible de valider un document xml correctement formé si il n'inclu pas les directive xsi? Donc au final, que le xml sorti par des tas d'outils déjà existant (inkscape par exemple) est invalide?
    Non, c'est juste que vu ton xml et le schema location j'ai fait au debut une erreur d'interprétation.
    On peut très bien ne valider que par une API et pour les cas que je connais l'API est prioritaire et on ignore les xsd ou dtd lié dans le document.
    Le truc c'est que là, les différence d'interprétation donnent l'impression d'une validation via 2 xsd
    Une par l'API, une autre par le schemalocation, peut être que ton API n'ignore pas elle les liaisons de validation du document ?

    En même temps le xsi:schemalocation je le trouve bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsi:schemaLocation="http://www.health.fgov.be/person http://www.health.fgov.be/person "
    Normalement la deuxième url devrait être de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsi:schemaLocation="http://www.health.fgov.be/person http://www.health.fgov.be/person/quelquechose.xsd "
    Je n'ai aucune idée de comment cela se comporte avec ce type d'URL

    Est ce que par hasard il y aurait d'autre xsd que medex.person.xsd sous l'emplacement http://www.health.fgov.be/person ?

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Salut,

    Citation Envoyé par tchize_ Voir le message
    Le processus de validation est bien enclenché, j'obtiens " cvc-complex-type.4: Attribute 'id' must appear on element 'personList'.", ce qui est bien le résultat souhaité. Cependant je me pose des questions quand à l'utilité de cette double déclaration xsi=schemaLocation, qui fait pointer le schéma sur lui même.
    Je pencherais pour une mauvaise interprétation de ce qu'est censé contenir schemaLocation.

    La chronologie de la phase de validation dans ton cas est la suivante :
    • L'analyseur XML, ayant son option de validation activée, repère un attribut xsi:schemaLocation et donne la main au validateur de schéma afin qu'il valide l'élément racine
    • Le Validateur de schéma détermine l'uri du schéma à utiliser en scrutant toutes les paires namespace/uri définies dans xsi:schemaLocation et en prenant l'uri auquel correspond le namespace de l'élément racine
    • Sans catalogue, cette uri est interprétée comme telle et désigne un fichier XSD à charger à partir du système de fichiers local ou sur le réseau
    • Avec un catalogue, cette uri sert de clé dans le catalogue pour déterminer l'uri réelle (ou physique) qui servira effectivement pour la validation

    Cela fonctionnerait exactement de la même façon si tu utilisais une autre uri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsi:schemaLocation="http://www.health.fgov.be/person toto"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <catalog
      xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
       <system systemId="toto"  uri="medex.person.xsd"/>
       <public publicId="toto" uri="medex.person.xsd"/>
    </catalog>
    Il me semble que l'uri de schemaLocation désigne un systemId dans le catalogue, et donc que ton élément <public> est inutile (il serait éventuellement utile si tu utilisais une DTD pour la validation plutôt qu'un XSD). C'est à vérifier dans la documentation de l'API.

    En conclusion, ça ne fonctionne correctement que parce que tu utilises un catalogue ; sans catalogue, l'uri associée au namespace ne permettant d'accéder à un schéma XSD, la validation échouerait.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. [XSD] Comment transformer un fichier xml en fichier xsd (java)
    Par mehdiing dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 20/03/2008, 11h21
  2. [XSD][Java]Valider un XML par rapport a un XSD
    Par sikapoch dans le forum Valider
    Réponses: 11
    Dernier message: 08/11/2005, 15h21
  3. [XSD][JAVA] Valider un XML avec un XSD schéma
    Par vad dans le forum Valider
    Réponses: 1
    Dernier message: 17/08/2005, 11h47
  4. [XML-DOM][XSD][JAVA] Génération de parseur
    Par charlot44 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/06/2005, 12h36
  5. [XSD][Java] choix de la techno
    Par cyrdec dans le forum Valider
    Réponses: 4
    Dernier message: 12/09/2003, 16h36

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