IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Désérialisation XML et balises vides


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut Désérialisation XML et balises vides
    Bonjour à tous.

    Je travaille actuellement sur un format de fichier dont la syntaxe est en XML. A partir du schéma XSD associé dont je dispose, j'ai créé les classes C# correspondantes via l'outil XSD.exe de .NET (xsd.exe /c /l:cs monschema.xsd).

    Lorsque j'essaie de désérialiser l'élément racine d'un fichier XML écrit selon ce schéma, j'obtiens des erreurs du type
    Il existe une erreur dans le document XML (148,23) ---> System.Format.Exception : Le format de la chaîne d'entrée est incorrect.
    Quand je regarde ligne 148, colonne 23 de mon fichier XML je me trouve juste après la balise fermante de l'élément . Après différents tests effectués en modifiant le fichier XML, il s'avère que tous les éléments "vides" devant contenir des entiers (et donc pour lesquels doit s'effectuer un cast string -> int) posent des problèmes lors de leur désérialisation. Cela ne change rien si j'essaie ou
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <ABSFront></ABSFront>
    .

    Quelqu'un aurait-il une petite idée ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Par défaut
    La seule qui me vient en tête, c'est qu'un Int n'est pas nullable. Et si une balise est vide, il considère la valeur comme nulle. Donc problème avec le cas d'un int.

    Soit, dans ta classe, la propriété de type int doit devenir nullable (>) ou alors, il faut forcer la valeur à 0 dans le XML que tu désérialize (0 étant le ).

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    J'ai remplacé les Int32 et les Decimal (pour lesquels j'ai le même problème)par des Nullable<Int32> et des Nullable<Decimal>, sans succès.

    Qu'entends-tu par "forcer la valeur à 0 dans le XML" ? (Parce que je n'ai pas accès du tout au code ayant servi à sérialiser les classes dans le fichier...)

  4. #4
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    ton xsd, tu l'as créé à partir d'un xml ? Dans ce cas, ton xml n'étais pas exaustif. Donc le schéma n'a pas connaissance de type nullables. A toi de l'en informer.

    ah, je viens de relire ton dernier poste.
    Donc, si tu n'as pas la main sur le XSD, ni les classes, il faut que tes fichier XML aient des valeurs pour les éléments numériques :
    <MonChiffre /> ne doit pas se trouver dans ton ficheir XML, à la place tu dois mettre des <MonChiffre>0</MonChiffre> (ou une valeur appropriée, selon ton fonctionnel).

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Le problème c'est que je ne contrôle pas la façon dont sont créés les fichiers XML... J'ai juste le schéma XSD et des fichiers XML générés par un logiciel, et je dois désérialiser l'objet racine des fichiers pour aller lire les informations dedans ...

  6. #6
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Que je comprenne bien :
    on te fourni des fichiers XML, tu as un schema pour la validation et tu dois déserialiser ?
    Tu as utilisé l'outil de génération de classes à partir du xsd, c'est bien ça ?

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    C'est exactement ça. Vu le nombre élevé de classes et de membres j'ai utilisé XSD.exe pour avoir directement les classes.

  8. #8
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Automatisation du travail...

    ok, donc ton xsd ne devait pas contenir une info xi:nil (de mémoire)...
    Donc tu es maîtres des classes... il faut que tu changes tes types int en int?, etc.
    et tu dois avoir un autre truc à faire...

    perso, je préfère créer mes classes "entity" à la main et, soit utiliser le XmlSerialize/XmlDeserialize, en taguant les attributs de ma classe ou carrément faire la mappage à la main...

    tu trouveras pleins d'infos dans le tuto de Thomas Levesque.

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Changer les types int en int? revient bien à les changer en Nullable<int>, non ? (c'est ce que j'ai lu quelque part). Parce que j'ai déjà essayé sans succès.

    J'ai essayé aussi de mettre IsNullable = true dans les paramètres de sérialisation/désérialisation appelés XmlElementAttribute.

    Enfin j'ai testé la solution d'indiquer une valeur par défaut :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    [System::ComponentModel::DefaultValueAttribute(System::Decimal::typeid, L"0.0")]
    , ça marche, mais lors de la lecture je ne saurais pas si elle a été lue ou si c'est celle par défaut...non ?

    Ecrire tout à la main... pfiou...

  10. #10
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Citation Envoyé par regliss76 Voir le message
    Changer les types int en int? revient bien à les changer en Nullable<int>, non ? (c'est ce que j'ai lu quelque part). Parce que j'ai déjà essayé sans succès.
    Oui. Mais tu ne fais qu'indiquer que l'attribut accepte null comme valeur. En aucun cas tu n'indique au mappage ce qu'il doit faire...

    Actuellement, tu as quelque chose qui faite du "int.Parse(Null-or-empty)" (un truc du genre) et c'est ça qui ne marche pas. Regarde dans le code où se fait le mapping xml/objet et change le code erroné.

    Comme quoi l'automatisation, si tu dois revenir dessus derrière parce que ça ne marche pas... En plus ça génère du code imbitable et inmaintenable.

    Bon courage car ce sera long et fastidieux

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Regarde dans le code où se fait le mapping xml/objet et change le code erroné.
    Tu veux dire dans les classes, au niveau des getters et setters ?

  12. #12
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    N'ayant jamais fais comme ça, je ne peux pas te dire... mais j'imagine qu'il y a un endroit où le XML est lu et les props des objets sont valuées... c'est là qu'il faut agir.

    Désolé, je ne peux pas t'en dire plus.

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Cet endroit m'est totalement inaccessible. Impossible de faire du pas à pas détaillé au niveau de la désérialisation...

  14. #14
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Biensûr, si tu utilises les classes .Net pour la désérialisation... Que Cretino !

    alors là, je sèche...

    je te dirai bien de faire à la mimine...

    Tu aurais un fragment Xml et le code de la clase y correspondant à fournir ?

  15. #15
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Finalement changement de plan, j'ai utilisé CodeSynthesis XSD, et ... ça marche !
    Merci de l'aide quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. TO XML (Balise vide)
    Par ricil78 dans le forum Linq
    Réponses: 2
    Dernier message: 28/11/2008, 15h28
  2. balise vide avec dom xml
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/08/2008, 16h59
  3. [XML] Ne pas afficher les balises vides
    Par ludo.guy dans le forum Reports
    Réponses: 0
    Dernier message: 03/10/2007, 12h01
  4. [XML] export, afficher balises vides
    Par peter2587 dans le forum VBA Access
    Réponses: 6
    Dernier message: 04/06/2007, 18h00
  5. [XML] ChildNodes: différencier si balise vide ou inexistante
    Par MiJack dans le forum Composants VCL
    Réponses: 4
    Dernier message: 05/04/2006, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo