Validation XML avec XSD

Résolu
cs_Spotty Messages postés 4 Date d'inscription jeudi 18 septembre 2008 Statut Membre Dernière intervention 11 février 2009 - 11 févr. 2009 à 10:30
cs_Spotty Messages postés 4 Date d'inscription jeudi 18 septembre 2008 Statut Membre Dernière intervention 11 février 2009 - 11 févr. 2009 à 16:18
Bonjour,


Cela fait deux jours que je suis sur ce problème. J'aimerais valider
mon XML avec un schéma XSD. Jusque là tout va bien j'ai trouvé tout ce
qu'il me fallait sur le net. Maintenant le problème est que j'essaie
d'avoir un schéma XSD le plus restrictif possible et c'est là que cela
commence à se gâter. J'ai vu que dès qu'on ajoutais des "nillable" et
des type a tester cela se compliquait. J'ai trouvé qu'il fallait
ajouter un attribut "nil=true" dans le XML mais maintenant c'est
encore, pire.


Voici mes exemple XML et XSD, il y aurait-il une âme charitable pour me
dire si y'a une solution ou si finalement au lieu de cherche à tester
un double je dois juste tester une string (mais on perds en
restriction...).

Mon XML :
<?xml version="1.0" encoding="utf-8" ?>
- <SellerExtranet>
- Ref="2890">
<Type>Appartment</Type>
<Transaction>Vente</Transaction>
<City>ARNAC POMPADOUR</City>
<District />
<Surface>50.5</Surface>
<Rooms>3</Rooms>
149000.45


<Currency>EUR</Currency>


- Ref="19295">
<Type>House</Type>
<Transaction>Location</Transaction>
<City>Paris 02</City>
<District />
<Surface>84</Surface>
<Rooms nil="true" />
680


<Currency>EUR</Currency>


</SellerExtranet>

Mon XSD :
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SellerExtranet">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Property">
<xs:complexType>
<xs:sequence>
<xs:element name="Type" type="xs:string" />
<xs:element name="Transaction" type="xs:string" />
<xs:element name="City" type="xs:string" />
<xs:element name="District" type="xs:string" />
<xs:element name="Surface" type="xs:decimal" />
<xs:element name="Rooms" type="xs:unsignedShort" nillable="true" />
<xs:element name="Price" type="xs:string" />
<xs:element name="Currency" type="xs:string" />
</xs:sequence>
<xs:attribute name="Ref" type="xs:unsignedShort" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Et voilà mes erreurs en retour :

Error: L'attribut 'nil' n'est pas déclaré. Error: L'élément 'Rooms' n'est pas valide - La valeur '' n'est pas valide selon son type de données 'http://www.w3.org/2001/XMLSchema:unsignedShort' - La chaîne '' n'est pas une valeur UInt16 valide. Error: L'attribut 'nil' n'est pas déclaré. Error: L'élément 'Rooms' n'est pas valide - La valeur '' n'est pas valide selon son type de données 'http://www.w3.org/2001/XMLSchema:unsignedShort' - La chaîne '' n'est pas une valeur UInt16 valide. Error: L'attribut 'nil' n'est pas déclaré. Error: L'élément 'Rooms' n'est pas valide - La valeur '' n'est pas valide selon son type de données 'http://www.w3.org/2001/XMLSchema:unsignedShort' - La chaîne '' n'est pas une valeur UInt16 valide.

Voilà en gros. Je vous remercie par avance de votre aide et si vous
avez des questions n'hésitez par. J'ai regardé partout sur le net mais
je ne trouve vraiment pas la solution...

6 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
11 févr. 2009 à 13:14
Hello,

Je n'ai jamais utilisé nillable, mais selon ce forum, il faut ajouter dans ton fichier xml le namespace
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
et écrire cet attribut xsi:nil="true"

Je n'ai pas essayé...

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
11 févr. 2009 à 13:04
Salut,
Tu as utilisé xsd.exe pour générer le schéma?

<hr />
-Blog-
-Site Perso-
0
cs_Spotty Messages postés 4 Date d'inscription jeudi 18 septembre 2008 Statut Membre Dernière intervention 11 février 2009
11 févr. 2009 à 14:32
Non pour générer le schéma j'ai utilisé tout ce qui est à notre disposition dans Visual studio dans un winforms qui récupère mon XML à la volée et en fait un schéma XSD :

private void button1_Click(object sender, EventArgs e)
        {
            string InputPath = tbInputPath.Text;
            string OutputPath = tbOutputPath.Text;
            this.Cursor = Cursors.WaitCursor;
            XmlReader One_XmlReader = XmlReader.Create(InputPath);
            XmlSchemaSet One_XmlSchemaSet = new XmlSchemaSet();
            XmlSchemaInference One_XmlSchemaInference = new XmlSchemaInference();
            TextWriter One_TextWriter = new StreamWriter(OutputPath);
           
            One_XmlSchemaSet = One_XmlSchemaInference.InferSchema(One_XmlReader);
            foreach (XmlSchema One_XmlSchema in One_XmlSchemaSet.Schemas())
            {
                One_XmlSchema.Write(One_TextWriter);
            }
            this.Cursor = Cursors.Default;
        }

Le truc c'est que je ne trouve pas le schéma assez restrictif donc j'avais envie de le rendre plus restrictif, mais bon vu comment je galère je crois que je vais définir une valeur par défaut à mes balises XML "0". Comme ça je n'aurais plus de balise vides et je pourrais toujours valider le type de retour...

Sinon oui Sharpmao, c'ets un peu ce que j'ai déjà bidouillé car j'ai trouvé ça comme toi, mais j'ai pas avancé plus sur cette voie, ma solution ne semble pas existée...
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
11 févr. 2009 à 16:01
Hello,

Et si au lieu d'avoir un nillable, tu mettais simplement minOccurs="0", pour rendre l'élément optionnel ?

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Spotty Messages postés 4 Date d'inscription jeudi 18 septembre 2008 Statut Membre Dernière intervention 11 février 2009
11 févr. 2009 à 16:13
Ben le problème c'est que élément optionnel veut dire que la ligne peut ne pas apparaître moi le problème est tout autre, la ligne apparaît mais en potentiellement vide...

Si je me minOccurs = 0 ça autorise ceci (plus de ligne Rooms) :
<?xml version="1.0" encoding="utf-8" ?>
- <SellerExtranet>
- Ref="2890">
<Type>Appartment</Type>
<Transaction>Vente</Transaction>
<City>ARNAC POMPADOUR</City>
<District />
<Surface>50.5</Surface>
149000.45


<Currency>EUR</Currency>


</SellerExtranet>

Hors l'histoire de Nillable c'ets d'avoir une balise vide (Rooms = "") :
<?xml version="1.0" encoding="utf-8" ?>
- <SellerExtranet>
- Ref="2890">
<Type>Appartment</Type>
<Transaction>Vente</Transaction>
<City>ARNAC POMPADOUR</City>
<District />
<Surface>50.5</Surface>
149000.45

<Rooms />
<Currency>EUR</Currency>


</SellerExtranet>

Donc en gros je ne peux pas traiter de la même manière...

En tout cas merci du temps que tu me consacre, je suis encore en train de faire des essais de mon côté... Si je trouve la solution je vous fait signe...
0
cs_Spotty Messages postés 4 Date d'inscription jeudi 18 septembre 2008 Statut Membre Dernière intervention 11 février 2009
11 févr. 2009 à 16:18
Bon ben finalement je retire tout ce que j'ai dis jusque là...

Sharpmao, ta solution fonctionne parfaitement. En fait j'avais des gros problème avec le namespace et donc je pensais pourvoir le supprimer mais en fait nom, il faut faire exactement ce qu'il y a de mentionner dans ton message et cela fonctionne.

Encore Merci !!!
0