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

VB.NET Discussion :

Problème lors de lecture ou écriture fichier XML.


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut Problème lors de lecture ou écriture fichier XML.
    Bonjour à tous.
    J'ai un bout de mon code qui m'affiche un défaut lors de son exécution.

    Voici le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Demarrage_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'S'exécute lors du chargement de la fenêtre Demmarrage.'
            LitClasses(Nom_Fichier_Data) 'Exécute la procédure LitClasses.'
            LitParametres(Nom_Fichier_Param) 'Exécute la procédure LitParamètres.'
    End Sub 'Fin de procédure.'
    Code de démarrage de mon application.

    La procédure LitClasses est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub LitClasses(ByVal FileNamedecrypt As String)
     
            If File.Exists(FileNamedecrypt) Then
                Données = LitDataXMLData(FileNamedecrypt) 'Exécute la fonction LitDataXMLData.'
            Else
                Données = New Data
                EcritDataXMLData(FileNamedecrypt, Données) 'Exécute la procédure EcritDataXMLData avec les paramètres FileNamedecrypt et Données.'
            End If
     
    End Sub
    Cette partie là fonctionne.

    La fonction LitDataXMLData est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Function LitDataXMLData(ByVal filename As String) As Data
     
            Try
                Using objStreamReader As New IO.StreamReader(filename)
                    Try
                        Return DirectCast((New XmlSerializer(GetType(Data))).Deserialize(objStreamReader), Data)
                    Catch ex As Exception
                        Erreur = True
                        MessageBox.Show("Echec de la lecture." & ex.Message)
                    End Try
                End Using
            Catch ex As Exception
                Erreur = True
                MessageBox.Show("Fichier inaccessible." & ex.Message)
            End Try
            Return Nothing
     
    End Function
    Là aussi pas de problème.

    La procédure EcritDataXMLData :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub EcritDataXMLData(ByVal filename As String, lesClasses As Data)
     
            Try
                Using objStreamWriter As StreamWriter = New StreamWriter(filename)
                    Try
                        Dim xsClasses As New XmlSerializer(GetType(Data), New XmlRootAttribute("Data"))
                        xsClasses.Serialize(objStreamWriter, lesClasses)
                    Catch ex As Exception
                        Erreur = True
                        MessageBox.Show("Echec de l'écriture." & ex.Message)
                    End Try
                End Using
            Catch ex As Exception
                Erreur = True
                MessageBox.Show("Fichier inaccessible." & ex.Message)
            End Try
     
    End Sub
    Toute cette partie fonctionne.

    Maintenant, la procédure LitParamètres (celle qui me plante le programme) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub LitParametres(ByVal FileNamedecrypt As String)
     
            If File.Exists(FileNamedecrypt) Then 'If File.Exists(FileNamecrypt) Then
                Paramètres = LitDataXMLPropriétés(FileNamedecrypt)
            Else
                Paramètres = New Propriétés 'Créé un nouvel objet Propriétés de nom "Paramètres".'
                EcritDataXMLPropriétés(FileNamedecrypt, Paramètres) 
            End If
     
    End Sub
    Il faut savoir que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Paramètres As Propriétés
    et que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <XmlRoot("Propriétés")>
    Public Class Propriétés
        <XmlElement("Couleur")>
        Public Property Valeurs_RVB As New Couleurs
        <XmlAttribute("Activer_Modification_MDP")>
        Public Property Act_MDP As New Activ_MDP
        <XmlElement("Classe")>
        Public Property Classe As New List(Of Classes)
    End Class
     
     
    Public Class Couleurs
        <XmlAttribute("Rouge")>
        Public Property Rouge As Integer = 255
        <XmlAttribute("Vert")>
        Public Property Vert As Integer = 255
        <XmlAttribute("Bleu")>
        Public Property Bleu As Integer = 128
    End Class
     
    Public Class Activ_MDP
        <XmlAttribute("Valeur")>
        Public Property Autor_MDP As Boolean = False
    End Class
     
    Public Class Classes
        <XmlAttribute("Nom_Classe")>
        Public Property Nom_Classe As String = ""
        <XmlElement("Exercice")>
        Public Property Exercice As New List(Of Exercices)
    End Class
     
    Public Class Exercices
        <XmlAttribute("Titre")>
        Public Property Titre As String = ""
        <XmlAttribute("Catégorie")>
        Public Property Catégorie As String = ""
        <XmlAttribute("Règles")>
        Public Property Règles As String = ""
        <XmlElement("Ligne_Exercice")>
        Public Property Ligne_Exercice As New List(Of Lignes_Exos)
    End Class
     
    Public Class Lignes_Exos
        <XmlAttribute("Type_Réponse")>
        Public Property Type_Réponse As String = ""
        <XmlAttribute("Phrase_1")>
        Public Property Phrase_1 As String = ""
        <XmlAttribute("Réponse")>
        Public Property Réponse As String = ""
        <XmlElement("Choix_Mots")>
        Public Property Choix_Mots As New List(Of Choix_de_mots)
        <XmlAttribute("Phrase_2")>
        Public Property Phrase_2 As String = ""
    End Class
     
    Public Class Choix_de_mots
        <XmlAttribute("Mot")>
        Public Property Mots As String = ""
    End Class
    Pour ce qui est de la fonction LitDataXMLPropriétés et de la procédure EcritDataXMLPropriétés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Function LitDataXMLPropriétés(ByVal filename As String) As Propriétés 'Créé la fonction lecture du fichier xml'
     
            Try 'Essaye le code suivant :'
                Using objStreamReader As New StreamReader(filename) 'Utilise le flux de données du fichier "filename"'
                    Try 'Essaye le code suivant : '
                        Return DirectCast((New XmlSerializer(GetType(Propriétés))).Deserialize(objStreamReader), Propriétés) 'Sérialise le fichier xml'
                    Catch ex As Exception 'Si l'essais échoue'
                        Erreur = True 'Met le booléen en valeur "vrai"' 
                        MessageBox.Show("Echec de la lecture." & ex.Message) 'Affiche un message d'erreur'
                    End Try 'Fin de l'essais du code'
                End Using 'Coupe toutes ressources utilisées pour créer le flux.'
            Catch ex As Exception 'Si le fichier n'existe pas'
                Erreur = True 'Met le booléen en valeur "vrai"'
                MessageBox.Show("Fichier inaccessible." & ex.Message) 'Affiche un message contenant l'erreur.'
            End Try 'Fin de l'essais du code'
            Return Nothing
     
    End Function
     
    Sub EcritDataXMLPropriétés(ByVal filename As String, paramètres As Propriétés)
     
            Try
                Using objStreamWriter As StreamWriter = New StreamWriter(filename)
                    Try
                        Dim xsPropriety As New XmlSerializer(GetType(Propriétés), New XmlRootAttribute("Propriétés"))
                        xsPropriety.Serialize(objStreamWriter, paramètres)
                    Catch ex As Exception
                        Erreur = True
                        MessageBox.Show("Echec de l'écriture." & ex.Message)
                    End Try
                End Using
            Catch ex As Exception
                Erreur = True
                MessageBox.Show("Fichier inaccessible." & ex.Message)
            End Try
     
    End Sub
    C'est donc lors de la lecture ou l'écriture de mon fichier de propriétés, que le logiciel plante et me dit qu'il ne peut lire, ni même écrire (ou créer) mon fichier...

    J'ai beau tourner mon code dans tous les sens je ne trouve pas....

    Désolé pour toute cette lecture et merci de votre aide par avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 502
    Points
    1 502
    Par défaut
    Salut,

    Tu peux faire un premier changement qui ne coute pas grand chose: eneleve les accents sur les noms de classes/variables. Je sais que theoriquement cela ne pose pas de probleme, mais dans la pratique ca peut.

    • Ensuite a part ce nommage entre tes 2 traitements c'est la meme chose ?
    • Les fichier sont bien differents ?
    • Le contenus est bien correct ?

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    Bonjour et merci de prêter attention à mon problème.

    alors
    - Oui c'est presque la même chose (un avec paramètre et l'autre avec données mais le reste de procédure est exactement le même).
    Si vous voulez le code de la partie "données" je peux vous le donner.

    - Les fichiers sont totalement différents (un nommé Temp.xml et l'autre tmp.xml)

    - Le contenue est Vide au départ vu que le fichier n'existe pas ! c'est pour cela que je vérifie l’existence ou non du ficher pour le créer et entrer des valeurs basiques où le lire.

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    +1 pour le nommage... Les accents français, ce n'est pas normalement prévu pour le VB.

    Quel est l'erreur exact à la création du fichier ?

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    J'ai rectifié les accents c'est le même problème.

    Il est :

    Une exception non gérée du type 'System.ObjectDisposedException' s'est produite dans System.Windows.Forms.dll

    Informations supplémentaires : Impossible d'accéder à un objet supprimé.

    ou

    Une erreur s'est produite lors de la réflexion du type 'Apprentissage_de_l_espagnol.Propriétés'.

    en fait il bloque au try :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return DirectCast((New XmlSerializer(GetType(Propriétés))).Deserialize(objStreamReader), Propriétés) 'Sérialise le fichier xml'
    et me passe donc ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Catch ex As Exception
          Erreur = True
          MessageBox.Show("Echec de la lecture." & ex.Message)
    et pour l'écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim xsPropriety As New XmlSerializer(GetType(Propriétés), New XmlRootAttribute("Propriétés"))
    xsPropriety.Serialize(objStreamWriter, paramètres)
    et me passe donc ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Catch ex As Exception
          Erreur = True
          MessageBox.Show("Echec de l'écriture." & ex.Message)

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Tu devrais remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        <XmlAttribute("Activer_Modification_MDP")>
        Public Property Act_MDP As New Activ_MDP
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        <XmlElement("Activer_Modification_MDP")>
        Public Property Act_MDP As New Activ_MDP

  7. #7
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    --' merci...

    J'avais remplacé à un moment mais ca m'allait pas donc j'ai effacer...
    Le boulet ...
    Merci beaucoup !

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par mactwist69 Voir le message
    +1 pour le nommage... Les accents français, ce n'est pas normalement prévu pour le VB.
    Donc, il ne faudrait pas utiliser les progrès technologiques et l'évolution du langage. Donc, en poussant le raisonnement plus loin, il faut revenir au GOTO. C'est au moins depuis Office 2002, si ce n'est pas avant, que VBA accepte les variables accentuées.

    C'est sûr qu'au début du BASIC et du code ASCII à 127 caractères, il était impossible d'avoir des variables accentuées; même que les variables étaient déjà limitées à 2 caractères et que l'affichage "graphique" se limitait à des dessins de caractères ASCII. Aujourd'hui, n'importe qui arrivant avec un programme VB affichant des figures dessinées en caractères ASCII se ferait fusiller et crucifier juste après.

    Donc, il ne faudrait jamais, utiliser de boucles DO-Loop, de Try-Catch-End Try, de XOR de ANDALSO, de POO, de modules de classe, de collections, de dictionnaires, Linq et de combien d'autres "patententes obligatoires" pour bien paraître. Tant qu'à y être, aussi bien lancer une pétition demandant à Microsoft de tuer VB.NET et même C# et C++

    Toutes les innovations technologiques apportées au BASIC d'origine ont été adoptées, sauf que dès que quelqu'un ose utiliser des accents dans une variable, là c'est la levée de boucliers. C'est complètement illogique.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 502
    Points
    1 502
    Par défaut
    Ecoute clementmarcotte,

    Je l'ai deja dit ici sur le forum et déjà prouve a de nombreux collègues, que les accents sont une source de bugs en C# mais aussi vb.net ainsi que d'autres langages.

    • je te laisse editer un web.config sur une prod comportant des accents avec notepad.
    • je te laisse egalement avoir des variables avec des accents et lancer un analiser de code (sonar par exemple).
    • Je te laisse creer des tables/colonnes en bdd avec des accents, ton dba va aimer.
    • Je te laisse enfin faire auditer ton code par un professionnel.



    Mais bon tu as raison bats-toi pour des accents, fais fi de toutes les bonnes pratiques tu connais la verite: http://www.developpez.net/forums/d15...f-l-extension/

    Je te laisse creer un sondage/une discussion/whatever, pour savoir si avoir des accents dans des noms de variables est tolerable.

    Sur ce, bonne nuit.

  10. #10
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Wow!


    Citation Envoyé par mermich Voir le message
    Ecoute clementmarcotte,
    [*]je te laisse editer un web.config sur une prod comportant des accents avec notepad.
    Le sujet porte sur les accents dans un nom de variable et tu sors un argument sans aucun rapport avec le sujet. Et puis le format XML est normalisé et il autorise tous les caractères Unicode, incluant les accents. Et puis utiliser Notepad pour modifier le web.config, c'est une aberration. Cela peut être fait manuellement avec My.Settings ou avec les outils que le Framework fournit pour la manipulation des fichiers xml.

    [*]je te laisse egalement avoir des variables avec des accents et lancer un analiser de code (sonar par exemple).
    Mettons que cela peut tenir la route, encore que ce ne sont pas tous les gens qui utilisent ces machins-là. Mais, la vraie question et la seule justification technique au bannissement systématique des caractères accentués dans le variables c'est qu'est-ce qui empêche le Framework de compiler correctement un programme avec des variables aux caractères accentués et à Windows de les exécuter. Rien n'oblige qui que ce soit à utiliser les caractères accentués. Rien n'oblige qui que ce soit à ne pas s'adapter à des circonstances particulières. Pour le reste, je vais élaborer plus tard à un autre endroit plus adapté que la réponse à une question.


    [*]Je te laisse creer des tables/colonnes en bdd avec des accents, ton dba va aimer.
    Le sujet porte sur les accents dans un nom de variable et tu sors encore une fois un argument sans aucun rapport avec le sujet. La difficulté de SQL avec des noms de champs a autant d'affinité avec la manière d'écrire une variable que Mulcair peut en avoir avec Harper.

    [*]Je te laisse enfin faire auditer ton code par un professionnel.
    Là tu portes un jugement de valeur. À l'université on m'a déjà dit que la première qualité d'un professionnel c'est de toujours avoir un questionnement sur les dogmes et les vérités que l'on croit immuables et de rester ouvert aux idées contradictoires. Mais comme ma formation n'est pas informatique, je n'ai pas eu de professeur qui a décrété du haut de sa chaire, et avec l'infaillibilité papale qui vient avec, qu'il ne fallait pas utiliser des accents dans une variable

    En résumé, sur tes 4 arguments, un seul a un peu de pertinence. Vraiment pas fort pour un "professionnel"

    La suite sur mon blogue d'ici quelques jours. Les commentaires pertinents et correctement étayés seront les bienvenus.

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

Discussions similaires

  1. [JDOM] Problème lors de lecture d'un fichier XML
    Par 0coco0 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 23/03/2009, 15h11
  2. probléme avec la lecture d'un fichier xml
    Par adel.87 dans le forum Débuter
    Réponses: 13
    Dernier message: 09/10/2008, 13h54
  3. problème lors de la sauvegarde du fichier XML
    Par DiamonDonald dans le forum VB.NET
    Réponses: 15
    Dernier message: 11/02/2008, 16h02

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