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:
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:
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:
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:
//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