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