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

XML Discussion :

Xerces C++ - DOM - XML - XSD - VALIDATION


Sujet :

XML

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 13
    Points
    13
    Par défaut 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:xsi="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:xs='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é

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    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.

Discussions similaires

  1. [Xerces][C++][DTD][XSD] Validation d'un fichier XML
    Par xxiemeciel dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 04/08/2010, 21h10
  2. [XSD] [Xerces-J 1.4.4] Validation XML avec schéma XSD
    Par g_rare dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 08/04/2008, 17h40
  3. Réponses: 4
    Dernier message: 15/11/2007, 11h44
  4. [XSD] [XML Schema]Validation sans mettre le xsd dans le xml
    Par sikapoch dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 07/06/2006, 15h23
  5. [Xml/Xsd]valider son fichier Xml avec un schéma xsd
    Par ePoX dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/02/2006, 23h30

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