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 d'import et de namespaces [XSD]


Sujet :

Valider XML

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Problème d'import et de namespaces
    Bonjour à toutes et à tous,

    Je vous remercie d'avance pour votre aide car j'en ai bien besoin, je tourne un peu en rond et je suis completement perdu car je suis novice en matière de XSD.

    Voici mes XSD :

    XMLSchema1 :

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="XMLSchema1"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               targetNamespace="http://tempuri.org/XMLSchema1.xsd"
               xmlns="http://tempuri.org/XMLSchema1.xsd"
               xmlns:s1="http://tempuri.org/XMLSchema1.xsd"
               xmlns:s2="http://tempuri.org/XMLSchema2.xsd"
               elementFormDefault="unqualified"
    >
     
      <!-- Imports -->
     
      <xs:import namespace="http://tempuri.org/XMLSchema2.xsd" schemaLocation="XMLSchema2.xsd" />
     
      <!-- Elements -->
     
      <xs:element name="a">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="a" type="s2:ct1" minOccurs="0" />
            <xs:element name="b" type="s1:ct2" minOccurs="0" />
            <xs:element name="c" type="s2:ct3" minOccurs="0" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
     
      <!-- Complex Types -->
     
      <xs:complexType name="ct2">
        <xs:sequence>
          <xs:element name="a" type="xs:string" minOccurs="0" />
        </xs:sequence>
      </xs:complexType>
     
    </xs:schema>
    XMLSchema2 :

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="XMLSchema2"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               targetNamespace="http://tempuri.org/XMLSchema2.xsd"
               xmlns="http://tempuri.org/XMLSchema2.xsd"
               xmlns:mstns="http://tempuri.org/XMLSchema2.xsd"
               elementFormDefault="unqualified"
    >
     
      <!-- Complex Types -->
     
      <xs:complexType name="ct1">
        <xs:sequence>
          <xs:element name="a" type="ct3" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:complexType>
     
      <xs:complexType name="ct3">
        <xs:sequence>
          <xs:element name="a" type="st1" minOccurs="0" />
          <xs:element name="b" type="st2" minOccurs="0" />
          <xs:element name="c" type="st3" minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="d" type="xs:string" use="required" />
      </xs:complexType>
     
      <!-- Simple Types -->
     
      <xs:simpleType name="st1">
        <xs:restriction base="xs:string">
          <xs:enumeration value="a" />
          <xs:enumeration value="b" />
        </xs:restriction>
      </xs:simpleType>
     
      <xs:simpleType name="st2">
        <xs:restriction base="xs:string">
          <xs:enumeration value="a" />
          <xs:enumeration value="b" />
          <xs:enumeration value="c" />
          <xs:enumeration value="d" />
        </xs:restriction>
      </xs:simpleType>
     
      <xs:simpleType name="st3">
        <xs:restriction base="xs:string">
          <xs:enumeration value="a" />
          <xs:enumeration value="b" />
          <xs:enumeration value="c" />
        </xs:restriction>
      </xs:simpleType>
     
    </xs:schema>
    Donc le XSD 1 importe les types complexes du XSD 2 pour pouvoir les utiliser.

    Le XML que je génère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="utf-8" ?>
    <a xmlns="http://tempuri.org/XMLSchema1.xsd">
      <a xmlns="">
        <a d="y"></a>
      </a>
      <b xmlns="">
        <a>abcd</a>
      </b>
      <c d="z" xmlns="">
        <b>a</b>
        <c>b</c>
      </c>
    </a>
    J'aimerais me débarasser de l'attribut "xmlns="">" dans les balises.

    Le "elementFormDefault="unqualified"" n'est pas censé faire en sorte que l'on ne soit pas obligé de spécifié le namespace?

    Merci de votre aide.
    Bonne et heureuse année 2011.

    Joooooon

  2. #2
    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
    Non

    Il fait en sorte que les éléments définis par imbrication n'aient pas de namespace. C'est à dire qu'ils doivent, spécifiquement, ne pas être dans un namespace. D'où la génération de xmlns="".

    Et c'est le comportement par défaut. Je hais XML Schema. Je le déteste profondément. Malheureusement, en validation XML, on doit jongler entre les compromis.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Ca veut dire que mon problème ne peut pas être résolu proprement?
    En attendant j'ai donc minimisé mes XSD contenant les types partagés aux types simples et non pas complexes.
    Ce qui provoque donc la duplication de les types complexes dans mes différents XSD (Ce que j'aimerais éviter).

    Sinon avant de poster un message sur le forum j'avais trouvé cette page en anglais qui traite du sujet mais impossible de reproduire le 1er cas.

    De plus à la fin de l'article il présente la méthode pour utilisé les namespaces cachés

    1 - La valeur de "elementFormDefault" doit être "unqualified"
    2 - L'élément ne doit pas être déclaré de façon globale

    C'est ce deuxième point qui est obscure et malheureusement montre un example de ce qu'il ne faut pas faire mais rien pour dire ce qu'il faut faire.

  4. #4
    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
    Citation Envoyé par Joooooon Voir le message
    Ca veut dire que mon problème ne peut pas être résolu proprement?
    Si ce que tu veux, c'est d'avoir tous les éléments dans le même namespace, mais dont certains sont validés dans un fichier importé par <xs:import> qualifié par un namespace différent, alors effectivement, je vois pas de moyen.
    Mais pour séparer des fichiers, il y a pas que <xs:import>, il y a <xs:include>, permettant de valider des éléments qualifiés par le même namespace.

    Mais bon, la question, c'est tu veux quoi ?

    Ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <a xmlns="http://tempuri.org/XMLSchema1.xsd">
      <a>
        <a d="y"></a>
      </a>
      <b>
        <a>abcd</a>
      </b>
    </a>
    Ou ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <s1:a xmlns:s1="http://tempuri.org/XMLSchema1.xsd">
      <a>
        <a d="y"></a>
      </a>
      <b>
        <a>abcd</a>
      </b>
    </s1:a>
    Ou autre chose ?

    Citation Envoyé par Joooooon Voir le message
    De plus à la fin de l'article il présente la méthode pour utilisé les namespaces cachés

    1 - La valeur de "elementFormDefault" doit être "unqualified"
    2 - L'élément ne doit pas être déclaré de façon globale
    Ce qu'il appelle des namespaces cachés, ce n'est que l'absence explicite de namespace. En gros, ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <s1:a xmlns:s1="http://tempuri.org/XMLSchema1.xsd">
      <a>
        <a d="y"></a>
      </a>
      <b>
        <a>abcd</a>
      </b>
    </s1:a>
    Où l'élément racine est qualifié, mais les autres ne le sont pas.
    Je ne vois pas l'intérêt, je ne sais pas pourquoi cette personne a cru bon de partager cette technique. Mais bon...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Effectivement c'est bien ça qui m'interresse:

    Si ce que tu veux, c'est d'avoir tous les éléments dans le même namespace, mais dont certains sont validés dans un fichier importé par <xs:import> qualifié par un namespace différent, alors effectivement, je vois pas de moyen.
    En fait en résultat je souhaite obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="utf-8" ?>
    <a xmlns="http://tempuri.org/XMLSchema1.xsd">
      <a>
        <a d="y"></a>
      </a>
      <b>
        <a>abcd</a>
      </b>
      <c d="z">
        <b>a</b>
        <c>b</c>
      </c>
    </a>
    Donc d'après ce que j'ai compris ce n'est pas possible car j'utilise un import d'un fichier XSD dont le namespace est différent de mon XSD source.

    Le seul moyen d'avoir ça c'est d'avoir soit tout dans le même XSD, soit faire un include (qui correspond à une simple scission de fichier XSD et non pas un XSD complet)

  6. #6
    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
    Tout-à-fait, d'ailleurs c'est un peu logique. Importer un schema d'un namespace différent, c'est pour valider les éléments d'un namespace différent. Si on veut autre chose on fait autre chose.

    Je pourrais pas jurer qu'on peut pas le faire, mais si on peut j'ignore comment.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Merci pour tout en tout cas.

  8. #8
    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 thelvin Voir le message
    Mais pour séparer des fichiers, il y a pas que <xs:import>, il y a <xs:include>, permettant de valider des éléments qualifiés par le même namespace.
    +1000 et je ne comprends pas pourquoi cela ne convient pas ici
    Citation Envoyé par thelvin Voir le message
    Je ne vois pas l'intérêt, je ne sais pas pourquoi cette personne a cru bon de partager cette technique. Mais bon...
    Je suis mitigé sur la technique mais je crois comprendre.
    L'intérêt des namespaces est en théorie d'éviter les collisions au niveau du traitement mais quiconque les a pratiqué , notamment en XSLT , sait qu'ils posent 100 fois plus de problèmes qu'ils ne sont censé en résoudre.
    Comme aujourd'hui ils servent surtout à "signer" une structure de donnée et que dans ce cas on en possède le XML Schema, ce concept à l'air de permettre de faire porter cette signature sur le seul XML Schema (à part le namespace de l'élément racine) tout en facilitant traitement et lisibilité du XML.

  9. #9
    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
    Citation Envoyé par Erwy Voir le message
    +1000 et je ne comprends pas pourquoi cela ne convient pas ici
    Ce que je suppose, c'est que le fichier à importer existe déjà, a été fait par quelqu'un d'autre, et est assez volumineux ou complexe.
    La volonté ici serait de s'en servir sans le modifier, et en utilisant ses règles de validation "sauf que le namespace n'est pas celui qu'il indique, mais celui de son importateur." ou "mais en ignorant le namespace qu'il indique"

    Si c'est ça, personnellement je ne serais pas frileux devant les deux solutions évidentes :
    - copier ce fichier verbatim, et dans la copie remplacer les deux fois où un namespace est annoncé, par le namespace qu'on veut. Inclure la copie au lieu de l'original.
    - utiliser le fichu namespace décidé par le fournisseur de ce fichier, dans le format XML.

    Mais j'ai vu bien assez de gens l'être.

    Citation Envoyé par Erwy Voir le message
    Je suis mitigé sur la technique mais je crois comprendre.
    L'intérêt des namespaces est en théorie d'éviter les collisions au niveau du traitement mais quiconque les a pratiqué , notamment en XSLT , sait qu'ils posent 100 fois plus de problèmes qu'ils ne sont censé en résoudre.
    Comme aujourd'hui ils servent surtout à "signer" une structure de donnée et que dans ce cas on en possède le XML Schema, ce concept à l'air de permettre de faire porter cette signature sur le seul XML Schema (à part le namespace de l'élément racine) tout en facilitant traitement et lisibilité du XML.
    Bon. Je parcours pourtant pas mal le monde XML, mais je n'y vois jamais ça. J'ai vu des choses qui peuvent s'y associer, mais c'est plutôt par des gens qui manquent manifestement de compétence XML, pas par des gens qui échangent des idées sur le net.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    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
    D'accrd avec tes deux solutions
    Citation Envoyé par thelvin Voir le message
    Bon. Je parcours pourtant pas mal le monde XML, mais je n'y vois jamais ça. J'ai vu des choses qui peuvent s'y associer, mais c'est plutôt par des gens qui manquent manifestement de compétence XML, pas par des gens qui échangent des idées sur le net.
    Jamais vu non plus je précise, d'ailleurs si j'ai essayé de comprendre le truc c'est près avoir vérifié le "CV" de l'auteur parce que je me suis demandé ce qu'était ce truc au départ.
    Si j'aime bien l'idée de déprécier le namespace sur le traitement (mis là je ne suis pas le seul, c'est le cas de presque tout ce qui est postérieur à XSLT 1.0...) mais de le faire porter sur le XSD, je n'aime pas trop la méthode ou on utilise ce qui sont déjà des cas particulier de XML Schema et de XML pour les détourner de leur but d'origine

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

Discussions similaires

  1. problème pour importer données excel dans Access
    Par sarah67 dans le forum Access
    Réponses: 8
    Dernier message: 20/02/2006, 08h17
  2. problème d'importation
    Par weejungle dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/12/2005, 15h22
  3. Réponses: 7
    Dernier message: 23/11/2005, 18h20
  4. Problème d'importation activeX
    Par arnaud2157 dans le forum MFC
    Réponses: 7
    Dernier message: 20/07/2005, 14h01
  5. Problème d'import avec l'interface sql server
    Par moutanakid dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/08/2004, 16h00

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