Validation XML avec XSD [Résolu]

Signaler
Messages postés
4
Date d'inscription
jeudi 18 septembre 2008
Statut
Membre
Dernière intervention
11 février 2009
-
Messages postés
4
Date d'inscription
jeudi 18 septembre 2008
Statut
Membre
Dernière intervention
11 février 2009
-
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

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
63
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)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
Tu as utilisé xsd.exe pour générer le schéma?

<hr />
-Blog-
-Site Perso-
Messages postés
4
Date d'inscription
jeudi 18 septembre 2008
Statut
Membre
Dernière intervention
11 février 2009

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...
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
63
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)
Messages postés
4
Date d'inscription
jeudi 18 septembre 2008
Statut
Membre
Dernière intervention
11 février 2009

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...
Messages postés
4
Date d'inscription
jeudi 18 septembre 2008
Statut
Membre
Dernière intervention
11 février 2009

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 !!!