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] Définir uniquement la racine d'un noeud mais pas son contenu


Sujet :

Valider XML

  1. #1
    Membre régulier
    Homme Profil pro
    responsable technique
    Inscrit en
    Novembre 2002
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : responsable technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 100
    Points : 89
    Points
    89
    Par défaut [XSD] Définir uniquement la racine d'un noeud mais pas son contenu
    Bonjour,
    J'ai une appli qui reçoit des données XML en entrée, chaque XML a le même format défini par le XSD 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
      <xs:include schemaLocation="commonTypes.xsd"/>
      <xs:include schemaLocation="civilStatusTypes.xsd"/>
     
    	<xs:element name="InsertionCivilStatusRequest">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element name="Tracability">
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element name="UserId" type="TUserIdVide"/>
    							<xs:element name="OriginId" type="TOriginId"/>
    						</xs:sequence>
    					</xs:complexType>
    				</xs:element>
    				<xs:element name="CivilStatus">
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element name="FirstName" type="TFirstNameVide"/>
    							<xs:element name="LastName" type="TLastName"/>
    							<xs:element name="Gender" type="TGender"/>
    							<xs:element name="BirthDate" type="TBirthDate"/>
    						</xs:sequence>
    					</xs:complexType>
    				</xs:element>
    				<xs:element name="Identifier">
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element name="RequestId" type="TReqId"/>
    						</xs:sequence>
    					</xs:complexType>
    				</xs:element>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    </xs:schema>
    et ça marche très bien avec des XML "simples".
    Sauf que les XML que je reçois seront en fait signés électroniquement avec un certificat de signature, ce qui fait que, au final, les XML auront une balise <Signature> en plus à la fin du document XML.
    Du coup, le XML n'est plus valide par rapport au XSD. J'aimerais donc pouvoir préciser qu'une balise <Signature> peut être présente mais sans en spécifier le contenu car je ne vais pas redéfinir le XSD d'une signature électronique.

    Est-il possible de définir une balise "libre", c'est-à-dire de définir uniquement le nom de la balise et que celle-ci contienne n'importe quelle arborescence ?
    Sinon est-il possible de définir le schéma standard d'une signature électronique en faisant référence à une URL par exemple ?

    merci d'avance
    Le marlou

  2. #2
    Membre régulier
    Homme Profil pro
    responsable technique
    Inscrit en
    Novembre 2002
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : responsable technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 100
    Points : 89
    Points
    89
    Par défaut
    Voila la solution :
    1/ il faut d'abord ajouter la déclaration du namespace d'une signature dans la définition du schema :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified">
    2/ il faut ensuite importer le schema d'une signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" />
    Si ça ne marche pas, c'est peut-être que l'outil de validation xsd n'a pas accès au schema distant défini dans "schemaLocation", dans ce cas, taper l'url du schema dans un navigateur et sauvegarder localement le schema, l'import sera alors le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig.xsd" />
    3/ il faut ensuite déclarer dans votre schéma XSD la présence (optionnelle dans mon cas) d'une signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
    Voila l'exemple complet correspondant au xml du premier post :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified">
      <xs:include schemaLocation="commonTypes.xsd"/>
      <xs:include schemaLocation="civilStatusTypes.xsd"/>
      <!-- Signature Import -->
      <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" />
      <!-- OU BIEN -->
      <!--xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig.xsd" /-->
     
    	<xs:element name="InsertionCivilStatusRequest">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element name="Tracability">
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element name="UserId" type="TUserIdVide"/>
    							<xs:element name="OriginId" type="TOriginId"/>
    						</xs:sequence>
    					</xs:complexType>
    				</xs:element>
    				<xs:element name="CivilStatus">
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element name="FirstName" type="TFirstNameVide"/>
    							<xs:element name="LastName" type="TLastName"/>
    							<xs:element name="Gender" type="TGender"/>
    							<xs:element name="BirthDate" type="TBirthDate"/>
    						</xs:sequence>
    					</xs:complexType>
    				</xs:element>
    				<xs:element name="Identifier">
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element name="RequestId" type="TReqId"/>
    						</xs:sequence>
    					</xs:complexType>
    				</xs:element>
    				<!-- Signature Declaration -->
    				<xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    </xs:schema>

  3. #3
    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 : 48
    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
    Quand on n'a un schéma il est toujours mieux de l'importer comme tu l'as fait, c'est la meilleur des solutions mais on peut définir que le contenu d'une balise est xml mais sans aller plus loin, si ça t'intéresse regarde du coté de l'élément any

    any permet d'étendre la liste des éléments pouvant être "validés", à tout fragment xml bien formé .La "rigidité" de la validation de ces éléments dépend de l'attribut processContents .
    • strict pour une validation complète
    • lax pour juste vérifié si cela est bien formé
    • skip valide ce qui est reconnu mais ne génére pas d'erreur pour le reste

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

Discussions similaires

  1. DOM, suprimer noeud mais pas le contenu
    Par junix dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/08/2009, 08h37
  2. [E-02] Définir les coordonnées d'une cellule en fonction de son contenu
    Par Karatégirl77 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/03/2009, 14h52
  3. [XSD] Définir un attribut unique
    Par tahtah dans le forum Valider
    Réponses: 1
    Dernier message: 03/01/2008, 10h40
  4. Récupérer uniquement la racine du site d'un referer
    Par bagu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 12/07/2006, 02h03
  5. [XSD] Définir des accents
    Par Da Troll dans le forum Valider
    Réponses: 4
    Dernier message: 30/05/2006, 13h34

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