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

  1. #1
    Membre à l'essai
    Xerces C++ - DOM - XML - XSD - VALIDATION
    Bonjour à tous...

    Je vais essayer d'être aussi précis que possible. Je suis actuellement sur un projet où je dois valider un fichier xml 'personal.xml' en utilisant un XML Schema 'personal.xsd'.

    Pour ce faire, je dois utiliser C++ (Visual C++) et Xerces-C++. J'ai parcouru tout le forum (avec keyword 'xerces' pr la recherche...), bref, j'ai lu une tonne de discussions sur la validation xml... mais aucunes de résolues!!

    Quelqu'un a-t-il réussi à valider un fichier XML avec un Schéma sous C++?

    Je suis ouvert à toutes suggestions... pour autant que ce soit en C++ et avec Xerces... SAX ou DOM... peu importe...

    Avant de me dire d'aller voir la Doc... je l'ai fait bien évidemment... le plus proche que j'ai trouvé étant:
    http://xerces.apache.org/xerces-c/schema.html

    Exemple de code utilisé:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
           XercesDOMParser* parser = new XercesDOMParser();  
            parser->setDoNamespaces(false);    // optional
    	parser->setDoSchema(true);
    	parser->setDoValidation(true);
    	parser->setExternalNoNamespaceSchemaLocation("personal.xsd");
    	parser->setValidationScheme(XercesDOMParser::Val_Always);
    	Grammar* grammar = parser->loadGrammar("personal.xsd",Grammar::SchemaGrammarType,true);
    	parser->useCachedGrammarInParse(true);
    	//parser->setValidationSchemaFullChecking(true);
    	//parser->setExternalSchemaLocation("personal.xsd");
            parser->parse("personal.xml");


    Mon fichier XML (repris des samples de Xerces! mais je ne montre qu'une personne pr raccourcir...):

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?proc-inst-1 'foo' ?>
    <personnel xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />si="http://www.w3.org/2001/XMLSchema-instance"
    	   xsi:noNamespaceSchemaLocation='personal.xsd'>
     
      <persondd id="Big.Boss">
        <name xml:base="foo/bar"><family  xml:base="bar/bar">Boss</family> <given xml:base="car/bar">Big</given><?proc-inst-2 'foobar' ?></name>
        <email>chief@foo.com</email>
        <link subordinates="one.worker two.worker three.worker four.worker five.worker"/>
      </persondd>
     
    </personnel>


    et mon fichier Schema (aussi repris des samples de Xerces!):

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    <?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'>
     
     <xs:import namespace="http://www.w3.org/XML/1998/namespace">
       <xs:annotation>
         <xs:documentation>
            The schemaLocation of the relevant file is
            "http://www.w3.org/2001/xml.xsd"; however,
            we don't want to assume people are always
            connected to the 'net when playing with this file.
         </xs:documentation>
       </xs:annotation>
     </xs:import>
     
     <xs:element name="personnel">
      <xs:complexType>
       <xs:sequence>
         <xs:element ref="person" minOccurs='1' maxOccurs='unbounded'/>
       </xs:sequence>
      </xs:complexType>
     
      <xs:unique name="unique1">
       <xs:selector xpath="person"/>
       <xs:field xpath="name/given"/>
       <xs:field xpath="name/family"/>
      </xs:unique>
      <xs:key name='empid'>
       <xs:selector xpath="person"/>
       <xs:field xpath="@id"/>
      </xs:key>
      <xs:keyref name="keyref1" refer='empid'>
       <xs:selector xpath="person"/> 
       <xs:field xpath="link/@manager"/>  
      </xs:keyref>
     
     </xs:element>
     
     <xs:element name="person">
      <xs:complexType>
       <xs:sequence>
         <xs:element ref="name"/>
         <xs:element ref="email" minOccurs='0' maxOccurs='unbounded'/>
         <xs:element ref="url"   minOccurs='0' maxOccurs='unbounded'/>
         <xs:element ref="link"  minOccurs='0' maxOccurs='1'/>
       </xs:sequence>
       <xs:attribute name="id"  type="xs:ID" use='required'/>
       <xs:attribute name="note" type="xs:string"/>
       <xs:attribute name="contr" default="false">
        <xs:simpleType>
         <xs:restriction base = "xs:string">
           <xs:enumeration value="true"/>
           <xs:enumeration value="false"/>
         </xs:restriction>
        </xs:simpleType>
       </xs:attribute>
       <xs:attribute name="salary" type="xs:integer"/>
       <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
      </xs:complexType>
     </xs:element>
     
     <xs:element name="name">
      <xs:complexType>
       <xs:all>
        <xs:element ref="family"/>
        <xs:element ref="given"/>
       </xs:all>
       <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
      </xs:complexType>
     </xs:element>
     
     <xs:element name="family">
       <xs:complexType>
         <xs:simpleContent>
           <xs:extension base='xs:string'>
              <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
            </xs:extension>
         </xs:simpleContent>
       </xs:complexType>
     </xs:element>
     
     <xs:element name="given" >
       <xs:complexType>
         <xs:simpleContent>
           <xs:extension base='xs:string'>
              <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/>
            </xs:extension>
         </xs:simpleContent>
       </xs:complexType>
     </xs:element>
     
     <xs:element name="email" type='xs:string'/>
     
     <xs:element name="url">
      <xs:complexType>
       <xs:attribute name="href" type="xs:string" default="http://"/>
      </xs:complexType>
     </xs:element>
     
     <xs:element name="link">
      <xs:complexType>
       <xs:attribute name="manager" type="xs:IDREF"/>
       <xs:attribute name="subordinates" type="xs:IDREFS"/>
      </xs:complexType>
     </xs:element>
     
     <xs:notation name='gif' public='-//APP/Photoshop/4.0' system='photoshop.exe'/>
     
    </xs:schema>


    Je rame depuis quelques jours... pourtant je suis sûr que je suis super proche d'y arriver... le prob avec ce code, c'est qu'il considère le xml comme valide dans tous les cas...

    par contre si je décommente la ligne:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    //parser->setExternalSchemaLocation("personal.xsd");


    le fichier xml devient invalide dans tous les cas...

    je ne sais vraiment plus quoi faire...

    J'espère que vous saurez m'aider...

    Merci d'avance,

    olo

  2. #2
    Membre expérimenté
    Salut,

    La seule piste que je peux te donner est d'aller jeter un oeil dans les sources de XeuMeuLeu qui est construit par dessus Xerces et fait de la validation.

    Sinon là comme ça juste en regardant ton code c'est dur à dire... Peut-être en utilisant un DOMBuilder et en faisant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
        builder.setFeature( XMLUni::fgXercesSchema, true );
        builder.setFeature( XMLUni::fgDOMValidation, true );
        builder.setFeature( XMLUni::fgXercesUseCachedGrammarInParse, true );
        builder.loadGrammar( "personal.xsd", Grammar::SchemaGrammarType, true );


    Sinon je crois aussi me souvenir que lorsqu'une grammaire n'est pas trouvée (genre le fichier n'existe pas) elle est tout simplement ignorée.

    MAT.