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 de validation


Sujet :

Valider XML

  1. #1
    Candidat au Club
    problème de validation
    Bonjour,

    Je débute avec XML/XSD.
    Je rencontre des difficultés lors de la validation du fichier XSD, je n'ai notamment pas compris l'utilisation de complexType et simpleType.


    Voici le fichier XML :

    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
    <?xml version="1.0" encoding="utf-8"?>
     
    <intervention nomintervention="vidange" nombreemecaniciens="1"
    xmlns="http://www.w3schools.com"
    xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />si="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3schools.com intervention.xsd">
     
    	<dureetauxhoraire1 unite="heures">1</dureetauxhoraire1>
     
    	<dureetauxhoraire2 unite="heures">0</dureetauxhoraire2>	
     
    	<piece nompiece="filtre">
    		<quantite unite="filtre">1</quantite>	
    	</piece>
     
    	<piece nompiece="joint">
    		<quantite unite="joint">1</quantite>	
    	</piece>
     
    	<piece nompiece="huile">
    		<quantite unite="litre">4</quantite>	
    	</piece>
     
    	<instructions>
    		<etape>Dévisser le bouchon de vidange à l'aide d'une clé de 13</etape>
    		<etape>Faire couler l'huile usagée</etape>
    		<etape>Revisser le bouchon de vidange</etape>
    		<etape>Dévisser le bouchon moteur et vider l'huile neuve</etape>
    		<etape>Faire le niveau et reboucher</etape>
    	</instructions>
     
    </intervention>


    et le fichier 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xs:schema xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />s="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.w3schools.com"
    xmlns="http://www.w3schools.com"
    elementFormDefault="qualified">
     
    <xs:element name="intervention">
     
    	<xs:complexType>
     
    	<xs:sequence>
     
    		<xs:element name="dureetauxhoraire1" minOccurs="1" maxOccurs="1">
    			<xs:complexType>
    				<xs:attribute name="unite" use="required">
    					<xs:simpleType>
    						<xs:restriction base="xs:string">
    							<xs:enumeration value="secondes"/>
    							<xs:enumeration value="minutes"/>
    							<xs:enumeration value="heures"/>
    						</xs:restriction>
    					</xs:simpleType>
    				</xs:attribute>
    			</xs:complexType>
    		</xs:element>
     
     
    		<xs:element name="dureetauxhoraire2" minOccurs="1" maxOccurs="1">
    			<xs:complexType>
    				<xs:attribute name="unite" use="required">
    					<xs:simpleType>
    						<xs:restriction base="xs:string">
    							<xs:enumeration value="secondes"/>
    							<xs:enumeration value="minutes"/>
    							<xs:enumeration value="heures"/>
    						</xs:restriction>
    					</xs:simpleType>
    				</xs:attribute>
    			</xs:complexType>
    		</xs:element>
     
     
    		<xs:element name="piece" minOccurs="2" maxOccurs="10">
    			<xs:complexType>
    				<xs:attribute name="nompiece" type="xs:string" use="required">
    					<xs:element name="quantite">	
    						<xs:complexType>
    							<xs:attribute name="unite" type="xs:string" use="required"/>
    						</xs:complexType>
    					</xs:element>
    				</xs:attribute>
    			</xs:complexType>
    		</xs:element>
     
     
    		<xs:element name="instructions" minOccurs="1" maxOccurs="1">
    			<xs:simpleType>
    				<xs:element name="etape" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
    			</xs:simpleType>
    		</xs:element>
     
     
    	</xs:sequence>
     
    	<xs:attribute name="nomintervention" type="xs:string" use="required"/>
    	<xs:attribute name="nombreemecaniciens" type="xs:integer" use="required"/>
     
    	</xs:complexType>
     
    </xs:element>
     
    </xs:schema>



    Voici les erreurs que cela me renvoie :


    Errors in the XML document:

    8: 57 cvc-complex-type.2.1: Element 'dureetauxhoraire1' must have no character or element information item [children], because the type's content type is empty.
    10: 57 cvc-complex-type.2.1: Element 'dureetauxhoraire2' must have no character or element information item [children], because the type's content type is empty.
    14: 10 cvc-complex-type.2.1: Element 'piece' must have no character or element information item [children], because the type's content type is empty.
    18: 10 cvc-complex-type.2.1: Element 'piece' must have no character or element information item [children], because the type's content type is empty.
    22: 10 cvc-complex-type.2.1: Element 'piece' must have no character or element information item [children], because the type's content type is empty.
    30: 17 cvc-type.3.1.2: Element 'instructions' is a simple type, so it must have no element information item [children].


    Errors in file intervention.xsd:

    46: 34 s4s-elt-must-match.1: The content of 'nompiece' must match (annotation?, (simpleType?)). A problem was found starting at: element.
    57: 19 s4s-elt-must-match.1: The content of 'simpleType' must match (annotation?, (restriction | list | union)). A problem was found starting at: element.

    Auriez vous une idée de ce qui ne va pas ?
    Merci beaucoup pour votre aide !

  2. #2
    Membre émérite
    Il y a nombreux d'erreurs, mais parmi eux souvent provenant d'erreur de conception identique. Donc, au final, un fois compris, ça se réduit à un petit nombre de cas générique.

    [1] L'élément instructions: c'est évidemment faux de le définir comme xs:simpleType. C'est évident.
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xs:element name="instructions" minOccurs="1" maxOccurs="1">
        <!-- xs:simpleType -->
        <xs:complexType>
            <xs:sequence>
                <xs:element name="etape" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
        <!-- /xs:simpleType -->
    </xs:element>

    [2] L'élément piece:
    [2.1] Un attribut n'est capable d'avoir un contenu complex, donc, xs:element n'est dans aucun cas permit d'apparaître comme enfant. Il faut laisser l'attribut nompiece tout seul, et attention, d'y mettre à la fin après des définitions d'éléments enfants, si il y en a.
    [2.2] Puis, ici c'est plus générique et applicable à tous les autres éléments semblables comme dureetauxhoraire1, dureetauxhoraire2 etc. Pour un élément origalement conçu comme du type simple et puis on veut l'attacher un ou plusieurs attributs, il devient en tout cas un élément du type complexe. Mais, il garde son caractère d'avoir un contenu simple. Et les attributs font une extension pour y être définis. Partout comme dureetauxhoraire1 etc se corrige de la même façon montrée dessous.
    Code xml :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
    <xs:element name="piece" minOccurs="2" maxOccurs="10">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="quantite">	
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="unite" type="xs:string" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <!-- remettre à la fin -->
            <xs:attribute name="nompiece" type="xs:string" use="required"></xs:attribute>
        </xs:complexType>
    </xs:element>

    [3] Et ceci n'est pas une erreur: quand on considère les facets comme minOccurs="2" maxOccurs="10", on peut y voir peut-être une nécessité, mais l'engin de validation y prend parfois assez mal et le procès commande pas mal de mémoires physiques en réserve. Donc, si, en cas, ces dernières sont précieuses et si il n'y a pas de raison incontournable, il vaut mieux éviter et le relaxe un peu comme mettant maxOccurs="unbounded". Mais c'est un détail pour le mement, on dirait.

    Voilà!

  3. #3
    Candidat au Club
    Merci beaucoup tsuji pour ta réponse.
    Je n'ai pas très bien compris le point 2.2

    Voici ce que j'ai fait pour dureetauxhoraire1 (et qui ne marche pas) :

    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
    <xs:element name="dureetauxhoraire1" minOccurs="1" maxOccurs="1">
    	<xs:complexType>
    		<xs:sequence>
    		</xs:sequence>
    		<xs:simpleContent>
    			<xs:extension base="xs:string">
    				<xs:attribute name="unite" type="xs:string" use="required"/>						
    				<xs:simpleType>
    					<xs:restriction base="xs:string">
    						<xs:enumeration value="secondes"/>
    						<xs:enumeration value="minutes"/>
    						<xs:enumeration value="heures"/>
    					</xs:restriction>
    				</xs:simpleType>						
    			</xs:extension>	
    		</xs:simpleContent>	
    	</xs:complexType>
    </xs:element>

  4. #4
    Membre émérite
    1) Enlevez lignes #2 et #3 <xs:sequence></xs:sequence>, on ne les trouve pas dans mon exemple. xs:sequence et xs:simpleContent sont mutuellement exclusifs.
    2) Et puis xs:attribut ne doit pas fermé avant d'ecriture de xs;simpleType/xs:restriction/xs:enumeration, il les enveloppe.

  5. #5
    Membre émérite
    2.1) L'écriture de xs:attribute etait correcte dans le post original; mais n'est plus dans le post dernier. A part mentionné dans 2), je dois ajouter qu'il ne faut pas mettre type="xs:string" dans la ligne #7 une fois xs:attribute est corrigé d'après 2): soit on met type="xxx", soit on fait xs:simpleType/xs;restriction etc...

  6. #6
    Candidat au Club
    Merci beaucoup pour ta réponse.
    J'ai enlevé type="xs:string" à la ligne <xs:attribute name="unite" type="xs:string" use="required"> et cela fonctionne à présent.

    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
    		<xs:element name="dureetauxhoraire2" minOccurs="1" maxOccurs="1">
    			<xs:complexType>
    				<xs:simpleContent>
    					<xs:extension base="xs:string">
    						<xs:attribute name="unite" use="required">					<!-- enlevé à cette ligne type="xs:string" -->		
    							<xs:simpleType>
    								<xs:restriction base="xs:string">
    									<xs:enumeration value="secondes"/>
    									<xs:enumeration value="minutes"/>
    									<xs:enumeration value="heures"/>
    								</xs:restriction>
    							</xs:simpleType>
    						</xs:attribute>						
    					</xs:extension>	
    				</xs:simpleContent>	
    			</xs:complexType>
    		</xs:element>


    Un gros merci.