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] Problème de validation avec espace de noms


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] Problème de validation avec espace de noms
    Bonjour les pro du xml

    J'essaie de mettre en place une xsd pour supprimer un warning dans un fichier xml. Alors j'ai la xsd suivante:

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
    targetNamespace="http://company.com/intranet/emailEvent/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://company.com/intranet/emailEvent/">
    <xs:annotation>
    	<xs:documentation>Schema used for email events configuration. Take a various list of email informations and associated events.</xs:documentation></xs:annotation>
      	<xs:element name="reminder">
          <xs:complexType>
        	<xs:sequence>
        		<xs:element name="email" minOccurs="0"
        			maxOccurs="unbounded">
        			<xs:complexType>
    			    	<xs:sequence>
    			    		<xs:element name="event" type="EventType" minOccurs="1"
    			    			maxOccurs="unbounded">
    			    		</xs:element>
    			    		<xs:element name="from" type="addressType" minOccurs="1"
    			    			maxOccurs="1">
    			    		</xs:element>
    			    		<xs:element name="to" type="addressType" minOccurs="0" maxOccurs="unbounded"></xs:element>
    			    		<xs:element name="bcc" type="addressType" minOccurs="0" maxOccurs="unbounded"></xs:element>
    			    		<xs:element name="subject" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
    			    		<xs:element name="html" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
    			    		<xs:element name="text" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
    			    	</xs:sequence>
          			</xs:complexType>
        		</xs:element>
        	</xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:complexType name="emailType">
        	<xs:sequence>
        		<xs:element name="event" type="EventType" minOccurs="1"
        			maxOccurs="unbounded">
        		</xs:element>
        		<xs:element name="from" type="addressType" minOccurs="1"
        			maxOccurs="1">
        		</xs:element>
        		<xs:element name="to" type="addressType" minOccurs="0" maxOccurs="unbounded"></xs:element>
        		<xs:element name="bcc" type="addressType" minOccurs="0" maxOccurs="unbounded"></xs:element>
        		<xs:element name="subject" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
        		<xs:element name="html" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
        		<xs:element name="text" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
        	</xs:sequence>
        </xs:complexType>
     
     
        <xs:simpleType name="EventType">
        	<xs:restriction base="xs:string"></xs:restriction>
        </xs:simpleType>
     
        <xs:simpleType name="addressType">
        	<xs:restriction base="xs:string"></xs:restriction>
        </xs:simpleType>
    </xs:schema>
    et le xml suivant:
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <reminder xmlns="http://company.com/intranet/emailEvent/"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:html="http://www.w3.org/1999/xhtml"
    	xsi:schemaLocation="http://company.com/intranet/emailEvent/ ./emailEvent.xsd">
    	<email>
    		<event>REMINDER</event>
    		<from>service@company.com</from>
    		<to>${email}</to>
    		<subject>Rappel tâche: ${activityname}</subject>
    		<html><![CDATA[
    		    <p>Ceci est un email automatique. Ne pas répondre!<br/>
    		    Dit is een automatisch email. Niet beantwoorden!</p>
    		    <p>
    		    Ceci est un rappel de tâche à éxecuter intitulée <b>${activityname}</b>.
    		    Cette tâche fait partie du workflow intitulé <b>${processname}</b><br/>
    		    blablabla
    		    ]]>
    		</html>
    		<text><![CDATA[
    Ceci est un email automatique. Ne pas répondre!
    Dit is een automatisch email. Niet beantwoorden!
     
    Vous avez reçu une nouvelle tâche intitulée *${activityname}*.
    Cette tâche fait partie du workflow intitulé *${processname}*
    blablabla
    ]]></text>
    </email>
    </reminder>
    Seulement voilà, eclipse me souligne le <email> dans le xml avec ce message d'erreur:


    cvc-complex-type.2.4.a: Invalid content was found starting with element 'email'. One of '{email}' is expected.


    Donc j'ai un peu de mal à capter le message d'erreur (je peux pas mettre email parce que je dois mettre email? )

  2. #2
    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 tchize_,

    tous tes éléments appartiennent au même espace de noms, il faut donc signaler au validateur de schéma que toutes les définitions d'élément sont qualifiées dans l'espace de nom par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:schema ... elementFormDefault="qualified">
    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

  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
    salut, ca marche avec ça. Par contre, ce qui me turlupine, j'ai toujours pas compris quelle est l'erreur et pourquoi ce truc magique la résoud (et je déteste ne pas savoir). On peux m'explique à quoi sert ce elementFormDefault et pourquoi j'en ai besoin?

  4. #4
    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
    Ton schéma est défini pour un espace de nom bien précis (celui qui se trouve dans targetNamespace). Tous les éléments globaux (définis directement sous xs:schema) sont validés par rapport à cet espace de noms. Par contre, les éléments locaux (tel que email) ne le sont pas, par défaut. Pour qu'ils soient validés selon l'espace de nom de leur ancètre, il faut mettre la value "qualified" à l'attribut elementFormDefault (par défaut elle est égale à "unqualified").

    Les espaces de noms en WXS sont un sujet complexe, du fait que par design les schémas peuvent valider des éléments d'espace de noms différents, et qu'un schéma validant un espace de noms peut inclure un autre schéma validant un autre espace de noms ; le validateur de schema doit pouvoir s'y retrouver (ce que le développeur de schéma n'arrive pas toujours bien à faire, lui )
    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

  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
    c'est toujours un peux vague pour moi. Il me semblait que justement c'était le rôle de la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns="http://company.com/intranet/emailEvent/"
    de dire que tout ce qui n'a pas de préfixe correspond à mon shéma.

    Et si j'avais fait ceci, il apprécie pas vraiment:

    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" encoding="UTF-8"?>
    <xs:schema targetNamespace="http://intrarmi.oma.be/intranet/emailEvent/"
    	xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:e="http://intrarmi.oma.be/intranet/emailEvent/">
    	<xs:annotation>
    		<xs:documentation>Schema used for email events configuration.
    			Take a various list of email informations and associated events.
    		</xs:documentation>
    	</xs:annotation>
    	<xs:element name="e:reminder">
          <xs:complexType>
        	<xs:sequence>
        		<xs:element name="e:server" maxOccurs="1" minOccurs="1">
        		    <xs:complexType>
        				<xs:sequence>
        					<xs:element name="e:host" type="xs:string" minOccurs="1" maxOccurs="1">
        					</xs:element>
        					<xs:element name="e:port" type="xs:decimal" minOccurs="0" maxOccurs="1">
     
    etc....
    Peut être que ce serait plus simple pour moi si on m'expliquait dans quel cas il ne faut "pas" utiliser elementFormDefault D'autant que l'éditeur de xsd graphique de eclipse, ben il le met pas!


    Edit: je viens partiellement de comprendre en générant un xml à partir d'un xsd sans cet attribut, j'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <tns:Test xmlns:tns="http://www.example.org/test/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/test/ test.xsd ">
      <NewElement>NewElement</NewElement>
      <NewElement1>NewElement1</NewElement1>
      <NewElement2>NewElement2</NewElement2>
      <NewElement3>
        <NewElement>NewElement</NewElement>
        <NewElement1>NewElement1</NewElement1>
        <NewElement2>NewElement2</NewElement2>
      </NewElement3>
    </tns:Test>
    Et donc je comprend que, sans l'attribut, je défini que, dans ma définition plus haut, la balise {"http://intrarmi.oma.be/intranet/emailEvent/":reminder} a pour fils un balise defaultNamespace:email (donc croisement des namespace, ouf ca je capte je pense).

    Bon, imaginons maintenant que ce que je veux faire c'est une balise X dans le namespace http://xyz qui a pour fils la séquence suivante
    1 fois la balise a dans le namespace http://abc et
    1 fois balise h dans le namespace http://hij, bref rendre ce xml valide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <nsx:x xmlns:nsx="http://xyz"
    xmlns:nsa="http://abc"
    xmlns:nsh="http://hij">
      <nsa:a/>
      <nsh:h/>
    </nsx:x>
    Je devrais coder comment le namespace http://xyz dans son xsd?

  6. #6
    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
    Citation Envoyé par tchize_ Voir le message
    Je devrais coder comment le namespace http://xyz dans son xsd?
    Tu ne pourras pas définir ces 3 éléments dans le même XSD ; chaque XSD valide dans un espace de noms bien défini, figurant dans targetNamespace (ou pas d'espace de nom du tout). Par contre, on peut référencer dans un schéma des éléments appartenant à d'autres espaces de noms, et donc définis dans d'autres XSD que l'on importe. Pour ton exemple, cela donne :

    a.xsd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://abc">
      <xs:element name="a" />
    </xs:schema>
    h.xsd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://hij">
      <xs:element name="h" />
    </xs:schema>
    x.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
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:nsh="http://hij"
      xmlns:nsa="http://abc"
      targetNamespace="http://xyz" >
      <xs:import namespace="http://abc" schemaLocation="a.xsd"/>
      <xs:import namespace="http://hij" schemaLocation="h.xsd"/>
      <xs:element name="x">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="nsa:a"/>
            <xs:element ref="nsh:h" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    Tu remarqueras que je n'ai défini nul part la valeur de elementFormDefault ; dans cet exemple elle n'est pas importante, toutes les définitions d'élément étant globales.
    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

  7. #7
    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
    ok, mais je pensais que ca aurais expliqué le comportement de elementFormDefault

    Etant donné qu'il n'est pas par défaut à qualified, tu pourrais me montre un xsd, où il y a plus que le top level (exemple une partie de mon xsd d'origine) mais où on ne l'utiliserais pas? Parce que j'ai du mal à comprendre pourquoi dans le xsd, mes éléments ne sont pas définis dans le même namespace si je ne le fait pas. En effet tu me montre que pour utiliser d'autre namespaces, je dois utiliser des attribut 'reference' alors quoi, si je met pas elementFormDefault, mes attribut ne sont pas défini dans mon namespace, mais il ne sont pas non plus définis dans un autre, je suis largué là ^^.

    En clair, je ne comprend pas à quoi pourrait servir de ne pas mettre elementFormDefault="qualified", et donc pas là même pourquoi cet truc existe

  8. #8
    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
    Bienvenue dans le monde magique et merveilleux des espaces de noms XML

    Pour comprendre le rôle de elementFormDefault, voici les règles à connaître, telles que définies par la spécification du W3C :

    1. Tous les éléments, types, groupes déclarés globalement appartiennent tous à l'espace de noms défini dans targetNamespace
    2. Tous les éléments, types, etc déclarés localement (par exemple: ton élément email) n'appartiennent par défaut à aucun espace de nom, ils sont non qualifiés ("unqualified")
    3. Pour que les éléments/types locaux appartiennent au même espace de noms que les éléments globaux (celui de targetNamespace), il faut qu'ils soient déclarés qualifiés ("qualified")
    4. Pour qualifier un élément local, on peut donner la valeur "qualified" à l'attribut form du xs:element qui le définit, ou bien la donner à elementFormDefault ce qui a pour effet de qualifier par défaut tous les éléments locaux

    Selon ces principes, dans le premier schéma que tu as posté l'élément email est non qualifié. Ce schéma ne pouvait donc valider le document XML qui l'accompagnait, puisque tous les éléments de ce document appartiennent au même espace de noms. Sous cette forme, ce schéma pourrait par contre valider le document suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <ev:reminder xmlns:ev="http://company.com/intranet/emailEvent/"
    ... >
    	<email>
    ou encore celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <reminder xmlns="http://company.com/intranet/emailEvent/"
    ... >
    	<email xmlns="">
    C'est plus clair comme cela ?
    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

  9. #9
    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
    ok, donc pour résumer, j'ai le choix entre ce paramètre global ou mettre sur tous mes xs:element l'attribut "form=qualified".

    Une dernière question, quel est l"intérêt me mettre des éléments hors namespace (namespace par défaut)? (Mise à part pour faire des erreurs, comme moi ^^)

  10. #10
    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
    Citation Envoyé par tchize_ Voir le message
    ok, donc pour résumer, j'ai le choix entre ce paramètre global ou mettre sur tous mes xs:element l'attribut "form=qualified".
    Tu as une autre possibilité : déclarer globalement tous tes éléments.
    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
    <xs:element name="reminder">
          <xs:complexType>
        	<xs:sequence>
        		<xs:element ref="email" minOccurs="0"
        			maxOccurs="unbounded"/>
        	</xs:sequence>
          <xs:complexType>
    </xs:element>
    <xs:element name="email">
    ...
    </xs:element>
    <xs:element name="event">
    ...
    </xs:element>
    ...
    Citation Envoyé par tchize_ Voir le message
    Une dernière question, quel est l"intérêt me mettre des éléments hors namespace (namespace par défaut)? (Mise à part pour faire des erreurs, comme moi ^^)
    J'inverserai la question : quel est l'intérêt d'utiliser des espaces de noms ? Les espaces de nom permettent d'éviter les collisions de nom lorsque des documents XML de sources différentes sont fusionnés. Par contre, ils introduisent un certain niveau de complexité supplémentaire, qui complique l'utilisation des outils de parsing, transformation, validation, etc., et ils ont un impact non négligeable sur les performances. Par conséquent, il faut cantonner leur usage au strict nécessaire, pour les éléments ou attributs pour lesquels il y a un risque réel de collision.
    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

  11. #11
    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 veux dire qu'il est préférable de faire un xml comme ça


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <e:reminder xmlns:e="http://.......">
       <email>...</email>
       <email>...</email>
       <email>...</email>
    </e:reminder>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <reminder xmlns="http://.......">
       <email xmlns="">...</email>
       <email xmlns="">...</email>
       <email xmlns="">...</email>
    </reminder>
    à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <reminder xmlns="http://.......">
       <email>...</email>
       <email>...</email>
       <email>...</email>
    </reminder>
    Je trouve cela assez curieux, j'ai toujours eu l'habitude d'être cohérent dans les namespace et tous les format xml que j'ai utilisé jusqu'à présent évitaient définir une partie de leur format dans leur namespace et les noeuds fils dans les namespace par défaut. Si je prend la pluspart des format répandu (xhtml, hibernate, j2ee, ....) on s'amuse pas à faire ce genre de mix :/

    Je comprend la nécessité de mixer des namespace. Par exemple du xslt doit pouvoir inclure un namespace autre pour la sortie, mais le schéma xslt en lui même est entièrement défini dans le namespace http://www.w3.org/1999/XSL/Transform.

  12. #12
    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
    Citation Envoyé par tchize_ Voir le message
    tu veux dire qu'il est préférable de faire un xml comme ça
    Tout dépend du contexte, et du traitement qui est fait de ces documents. Les fichiers XML hibernate et J2EE sont généralement conçus pour n'être analysés qu'une seule fois au démarrage du système et à l'origine étaient rédigés « à la main » (ils sont maintenant la plupart du temps générés par les EDI). Placer tous les éléments de ces fichiers dans le même espace de noms offre une commodité pour l'utilisateur et une sécurité sans véritable pénalité. Quant à XHTML, par design il a été conçu pour intégrer différents vocabulaires XML, l'usage des espaces de noms était obligatoire. On peut en dire autant de formats documentaires comme ODF et OpenXML.

    A l'inverse, il existe de nombreux formats XML, très couramment utilisés, qui présentent un mélange d'espace de noms, avec parfois des éléments sans espace de noms. SOAP, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version='1.0' encoding='UTF-8'?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/1999/XMLSchema">
    <SOAP-ENV:Body>
    <ns1:doSpellingSuggestion xmlns:ns1="urn:GoogleSearch" 
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <key>cmYEU..................6aXqlf</key>
    <phrase>gemany</phrase>
    </ns1:doSpellingSuggestion>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    Ou encore XSLT, que tu as cité comme format « full namespace » mais qui est en fait un contre-exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="writer">
      <auteur>
        <nom><xsl:value-of select="lastname" /></nom>
        <prenom><xsl:value-of select="firstname" /></prenom>
      </auteur>
    </xsl:template>
    En considérant les espaces de nom d'un point de vue purement syntaxique, quelle est la différence entre cet exemple et celui-ci (au passage, à préférer nettement à celui avec xmlns="") ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <e:reminder xmlns:e="http://.......">
       <email>...</email>
       <email>...</email>
       <email>...</email>
    </e:reminder>
    Les espaces de noms font partie des éléments parmi les plus décriés de XML ; ils compliquent la vie des utilisateurs, et celle de ceux qui doivent implémenter leur gestion dans des outils. Moi-même, qui a développé une implémentation de XPath en Python, je peux te dire que c'est la plaie à gérer...
    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

  13. #13
    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
    Citation Envoyé par GrandFather Voir le message
    Ou encore XSLT, que tu as cité comme format « full namespace » mais qui est en fait un contre-exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="writer">
      <auteur>
        <nom><xsl:value-of select="lastname" /></nom>
        <prenom><xsl:value-of select="firstname" /></prenom>
      </auteur>
    </xsl:template>
    En considérant les espaces de nom d'un point de vue purement syntaxique, quelle est la différence entre cet exemple et celui-ci (au passage, à préférer nettement à celui avec xmlns="") ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <e:reminder xmlns:e="http://.......">
       <email>...</email>
       <email>...</email>
       <email>...</email>
    </e:reminder>
    Les espaces de noms font partie des éléments parmi les plus décriés de XML ; ils compliquent la vie des utilisateurs, et celle de ceux qui doivent implémenter leur gestion dans des outils. Moi-même, qui a développé une implémentation de XPath en Python, je peux te dire que c'est la plaie à gérer...
    Je me suis peut être mal exprimé J'entendais avec l'exemple de xsl, que, "dans la définition", aucune des balises définie n'est dans un espace de nom autre que le namespace xsl. Certes, je peux ajouter les balise auteur , etc, mais ces balises ne sont nullement définies dans le chéma xsl. On dit juste dans le xsl "ici on peut mettre n'importe quoi d'un autre espace de nom":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:anyAttribute namespace="##other" processContents="lax"/>
    de même dans soap,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xs:sequence>
    <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
    </xs:sequence>
    , hors mon schéma erronné disait "ici on *doit* mettre email qui *doit* etre dans l'espace de nom par défaut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xs:sequence>
        		<xs:element name="email" minOccurs="0"
        			maxOccurs="unbounded">
        			<xs:complexType>
    elle est là la différence.

    Je conçoit bien la nécessite de devoir faire des shéma autorisant l'inclusion d'autres namespace (c'est utile pour xhtml quand il inclu du svg par exemple, c'est utilse pour xsl quand il doit inclure les balise du document de destination, c'est utilse pour soap qui doit inclure des balise propres à la requête).

    Tout tourne autour de la question, a-t-on des exemples de schéma xsl où des xsd:element dont définit dans l'espace de nom par défaut plutôt que de l'être dans le même espace que le noeud racine (et je parle pas des cas où tu inclue un autre schéma d'une manière ou d'une autre, je parle de cas comme le mien où tu impose la balise). Pourquoi je me pose la question de l'utilité? Ben parce que visiblement c'est le comportement par défaut Et j'ai l'impression d'etre face à un comportement par défaut qui est contraire au "besoin par défaut" (le balise que je défini, habituellement, je les définis dans mon espace de nom ^^)

    Donc j'aimerais comprendre si il y a vraiment une utilité à ce comportement par défait, ou si c'est juste une curiosité de la part du format xsl. J'ai bien compris que je devait le préciser, je comprend juste pas pourquoi on a décidé dans la spécification que je devais le faire alors que, toutes façons, toutes les xsl incluant d'autre schéma explicitent clairement que c'est un autre schéma


    PS: je sais, je suis chiant

  14. #14
    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
    Citation Envoyé par tchize_ Voir le message
    Donc j'aimerais comprendre si il y a vraiment une utilité à ce comportement par défait, ou si c'est juste une curiosité de la part du format xsl. J'ai bien compris que je devait le préciser, je comprend juste pas pourquoi on a décidé dans la spécification que je devais le faire alors que, toutes façons, toutes les xsl incluant d'autre schéma explicitent clairement que c'est un autre schéma
    En ce qui concerne le choix de la valeur "unqualified" par défaut pour elementFormDefault, je pense que la raison est d'ordre historique. Les espaces de noms sont apparus après la spécification de XML 1.0, et les DTD, qui ont été la première solution de validation, ne les prennent pas en compte. Pour une DTD, e:reminder n'est pas un nom qualifié, c'est un simple nom d'élément comportant : comme deuxième caractère.

    On a donc tout un ensemble de vocabulaires qui se sont créés sans espace de noms, qu'il a fallu par la suite intégrer dans des ensembles plus vastes, donc avec risque de collision. Pour ne pas rompre la compatibilité avec l'existant (souvent défini dans des DTD), on ne pouvait pas leur coller arbitrairement un espace de noms, la solution la plus simple a consisté à placer des éléments de ces vocabulaires dans un élément conteneur disposant lui d'un espace de noms.

    La bonne question est celle de la bonne pratique : doit-on, lorsqu'on crée un vocabulaire XML, systématiquement lui définir un espace de noms ? La réponse est : systématiquement, non. Si le vocabulaire XML ne répond qu'à des besoins locaux (ceux d'une application ou d'une seule entité), les inconvénients causés par les espaces de noms n'en valent pas la peine ; si par contre il a vocation à s'aggréger à d'autres vocabulaires, alors c'est préférable.

    Citation Envoyé par tchize_
    PS: je sais, je suis chiant
    Meuh non, ça m'oblige à me repencher sur des trucs que j'utilise couramment en ayant oublié leur fondement et leur pertinence, c'est salutaire.
    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

  15. #15
    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
    merci pour les infos.

    PS: on prefère utiliser des espaces de nom même pour les trucs locaux, c'est plsu facile pour la validation, on s'y retrouve et notre ide aussi :p.

  16. #16
    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
    Citation Envoyé par tchize_ Voir le message
    PS: on prefère utiliser des espaces de nom même pour les trucs locaux, c'est plsu facile pour la validation, on s'y retrouve et notre ide aussi :p.
    Il ne faut pas considérer l'usage des espaces de nom que sous le seul angle de la validation, et ta question initiale est la preuve que cela ne facilite en rien la validation, au contraire.

    Tiens, une hypothèse idiote, si demain ton entreprise est rachetée et change de nom, que devient ton espace de nom "xmlns:ev="http://company.com/intranet/emailEvent/" ? Il est possible de se prémunir de ce problème en choisissant plutôt une URN, et en sélectionnant soigneusement le NID, mais le critère d'unicité de l'espace de noms est quelque chose dont il faut se préoccuper, surtout si la diffusion est à large spectre. L'exemple peut sembler contraint, mais ce n'en est qu'un parmi d'autres joyeusetés causées par les espaces de nom. D'ailleurs, la majorité des « Guru XML » considère les espaces de nom comme un « mal nécessaire ».
    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

  17. #17
    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
    Citation Envoyé par GrandFather Voir le message

    Tiens, une hypothèse idiote, si demain ton entreprise est rachetée et change de nom, que devient ton espace de nom "xmlns:ev="http://company.com/intranet/emailEvent/"
    Il bouge pas, il est dans un catalogue local et de toute facon l'url correspond à rien

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

Discussions similaires

  1. problème de validation avec DispachAction
    Par khayri dans le forum Struts 1
    Réponses: 26
    Dernier message: 18/01/2008, 17h43
  2. Réponses: 1
    Dernier message: 14/02/2007, 08h14
  3. [XSD] problème de validation
    Par anitshka dans le forum Valider
    Réponses: 1
    Dernier message: 23/11/2006, 12h38
  4. Problème de validation avec le clientsocket
    Par stroumfs dans le forum Delphi
    Réponses: 2
    Dernier message: 03/11/2006, 18h41
  5. Réponses: 4
    Dernier message: 25/10/2006, 08h57

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