Validation XML avec XSD [Résolu]

cs_Spotty 4 Messages postés jeudi 18 septembre 2008Date d'inscription 11 février 2009 Dernière intervention - 11 févr. 2009 à 10:30 - Dernière réponse : cs_Spotty 4 Messages postés jeudi 18 septembre 2008Date d'inscription 11 février 2009 Dernière intervention
- 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...
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 11 févr. 2009 à 13:14
3
Merci
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)

Merci SharpMao 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de SharpMao
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 11 févr. 2009 à 13:04
0
Merci
Salut,
Tu as utilisé xsd.exe pour générer le schéma?

<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
cs_Spotty 4 Messages postés jeudi 18 septembre 2008Date d'inscription 11 février 2009 Dernière intervention - 11 févr. 2009 à 14:32
0
Merci
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...
Commenter la réponse de cs_Spotty
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 11 févr. 2009 à 16:01
0
Merci
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)
Commenter la réponse de SharpMao
cs_Spotty 4 Messages postés jeudi 18 septembre 2008Date d'inscription 11 février 2009 Dernière intervention - 11 févr. 2009 à 16:13
0
Merci
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...
Commenter la réponse de cs_Spotty
cs_Spotty 4 Messages postés jeudi 18 septembre 2008Date d'inscription 11 février 2009 Dernière intervention - 11 févr. 2009 à 16:18
0
Merci
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 !!!
Commenter la réponse de cs_Spotty

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.