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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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

+ 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