Extraction de données d'un xml [Résolu]

cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 14 août 2011 à 14:30 - Dernière réponse : cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention
- 20 août 2011 à 13:21
Bonjour à tous !

J'ai regardé pas mal de posts sur le xml et j'ai trouvé une partie de mes réponses.
Cependant comme chaque code est particulier j'ai encore quelques questions.

J'ai un fichier xml qui doit contenir des informations sur des fichiers.
Je veux extraire ces données pour les comparer et faire une mise à jour des fichiers qui seraient différent.

J'ai réfléchis pour les structures xml suivantes :
Le but étant d'extraire la taille et la date du fichier en fonction du nom du pack.





nom
Afficher la suite 

7 réponses

Répondre au sujet
Utilisateur anonyme - 14 août 2011 à 20:08
+3
Utile
Salut,

Tu devrais passer par la sérialisation qui est bien plus simple à mettre en oeuvre.
Voici un petit exemple adapté à ton cas :
Imports System.Xml.Serialization
Imports System.IO
Public Class Form1
    Dim Liste As New Client
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'ajout des données
        Liste.Add(New Pack("test1", 1000, Now))
        Liste.Add(New Pack("test2", 2000, Now))
        Liste.Add(New Pack("test3", 3000, Now))
        Liste.Add(New Pack("test4", 4000, Now))

        'ecriture : sérialisation de la classe client
        Dim FluxDeFichierWrite As FileStream = File.Create("Clients.xml")
        Dim Serialiseur As New XmlSerializer(GetType(Client))
        Serialiseur.Serialize(FluxDeFichierWrite, Liste)
        FluxDeFichierWrite.Close()

        'lecture : déserialisation de la classe client
        Dim FluxDeFichierRead As FileStream = File.Open("Clients.xml", FileMode.Open)
        Dim DeSerialiseur As New XmlSerializer(GetType(Client))
        Liste = New Client
        Liste = CType(DeSerialiseur.Deserialize(FluxDeFichierRead), Client)
        FluxDeFichierRead.Close()

        'affichage du pack 1 lu depuis Clients.xml
        MessageBox.Show(Liste.Packs(1).pNom & Environment.NewLine & _
                        Liste.Packs(1).pTaille & Environment.NewLine & _
                        Liste.Packs(1).pDate.ToString)
    End Sub

    Public Class Client
        Public Packs As New List(Of Pack)
        Sub Add()

        End Sub
        Sub Add(ByVal Packi As Pack)
            Packs.Add(Packi)
        End Sub
    End Class


    Public Class Pack
        Public Nom As String
        Public Taille As Integer
        Public sDate As Date
        Sub New()

        End Sub
        Sub New(ByVal nNom As String, ByVal nTaille As Integer, ByVal nDate As Date)
            Nom = nNom
            Taille = nTaille
            sDate = nDate
        End Sub

        ReadOnly Property pNom() As String
            Get
                Return Nom
            End Get
        End Property
        ReadOnly Property pTaille() As Integer
            Get
                Return Taille
            End Get
        End Property
        ReadOnly Property pDate() As Date
            Get
                Return sDate
            End Get
        End Property
    End Class

End Class


J'ai regroupé le remplissage des données, l'écriture du xml et sa lecture dans le Form_Load pour l'exemple.

A bientôt.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 15 août 2011 à 13:28
0
Utile
Je connaissais pas cette méthode (la serialization) mais c'est simple et efficace :)
Je te remercie beaucoup pour ton aide.
Commenter la réponse de cs_oxygene2
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 16 août 2011 à 19:52
0
Utile
Encore une petite question :

Le principe de la sérialisation est super.
Dans mon cas le fichier xml sera téléchargé (donc ce qui m'intéresse c'est uniquement la lecture).

Le problème avec ton code est que la variable "liste" est utilisée pour l'ajout de donnée ce qui empêche d'utiliser uniquement la partie dé sérialisation seule.

Comment puis je dé-sérialiser un fichier xml dont je connais la structure ?
Faut il faire un schéma XSD ?
Commenter la réponse de cs_oxygene2
Utilisateur anonyme - 16 août 2011 à 21:06
0
Utile
Re,
Le problème avec ton code est que la variable "liste" est utilisée pour l'ajout de donnée ce qui empêche d'utiliser uniquement la partie dé sérialisation seule.

Rien ne t'empêche de déclarer une autre variable pour la lecture :
Dim FluxDeFichierRead As FileStream = File.Open("Clients.xml", FileMode.Open)
Dim DeSerialiseur As New XmlSerializer(GetType(Client))
Dim MesDonnees As New Client
MesDonnees = CType(DeSerialiseur.Deserialize(FluxDeFichierRead), Client)
FluxDeFichierRead.Close()

Autre chose, j'ai déclaré les propriétés ReadOnly, ce qui va t'empêcher de modifier les valeurs. Donc les propriétés doivent être en lecture et ecriture.
Par exemple, pour la propriété Date :
Property pDate() As Date
    Set(ByVal value As Date)
        sDate = value
    End Set
    Get
        Return sDate
    End Get
End Property

Ainsi, après désérialisation, tu pourras modifier tes données comme ceci :
Liste.Packs(1).pDate = Now

Et ensuite sérialiser à nouveau pour refaire un xml mis à jour.

Comment puis je dé-sérialiser un fichier xml dont je connais la structure ?

En créant une classe adaptée à la structure du xml.
Il te sera plus facile de faire l'inverse (sérialisation) et d'observer le résultat obtenu, jusqu'à obtenir la même structure que celle de ton xml de référence.

Bonne soirée.
Commenter la réponse de Utilisateur anonyme
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 16 août 2011 à 22:32
0
Utile
Tout d'abord merci banana pour le temps que tu as pris à me répondre.

En fait mon application n'a pas besoin de sérialiser puisque je vais télécharger le xml (que j'aurais créer via une autre appli.

Je vais essayer d'expliquer clairement ce que je compte faire :)
Système de maj à double emploi : mettre à jour et empêcher de lancer l'application avec des fichiers modifiés (car téléchargés si différents).
Voici comment je comptais m'y prendre :

1 téléchargement du xml à jour depuis le FTP
2 lecture du xml et stockage des valeurs dans des variables (ou un array peu importe)
3 Comparaison de ces valeurs avec les fichiers présents dans le dossier de l'appli (via des filelen etc...)
4 Si données différentes alors téléchargements des fichiers fichiers.
5 Suite de l'appli


Voici le début du code (l'étape 3 à 5 ne devraient pas me poser de pb) :

Imports System.Security.Permissions
Imports System.Net
Imports System.Xml.Serialization
Imports System.IO
Imports System.Xml
Function telecharger(ByVal lien, ByVal chemin)
        Dim Client As Net.WebClient = New Net.WebClient
        Client.DownloadFileAsync(New Uri(lien), "." & chemin)
    End Function

'ACTIONS AU DEMARRAGE   
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Etat.Text = " Bienvenue sur "..." & vbCrLf & "Vérification client en cours"
   'téléchargement du xml
   telecharger("http://"lien URL"/clients.xml", ".\Clients.xml")

   'lecture : déserialisation de la classe client
Dim FluxDeFichierRead As FileStream = File.Open("Clients.xml", FileMode.Open)
Dim DeSerialiseur As New XmlSerializer(GetType(Client))
Dim liste = New Client
liste = CType(DeSerialiseur.Deserialize(FluxDeFichierRead), Client)
FluxDeFichierRead.Close()

'affichage du pack 1 lu depuis Clients.xml
  MessageBox.Show(liste.Packs(0).pNom & Environment.NewLine & _
  liste.Packs(0).pTaille & Environment.NewLine & _
  liste.Packs(0).pDate.ToString)

  Public Class Client
        Public Packs As New List(Of Pack)
        Sub Add()

        End Sub
        Sub Add(ByVal Packi As Pack)
            Packs.Add(Packi)
        End Sub
   End Class


   Public Class Pack
        Public Nom As String
        Public Taille As Integer
        Public sDate As Date
        Sub New()
        End Sub

    Sub New(ByVal nNom As String, ByVal nTaille As Integer, ByVal nDate As Date)
            Nom = nNom
            Taille = nTaille
            sDate = nDate
        End Sub

        Property pNom() As String
            Set(ByVal value As String)
                Nom = value
            End Set
            Get
                Return Nom
            End Get
        End Property
        Property pTaille() As Integer
            Set(ByVal value As Integer)
                Taille = value
            End Set
            Get
                Return Taille
            End Get
        End Property
        Property pDate() As Date
            Set(ByVal value As Date)
                sDate = value
            End Set
            Get
                Return sDate
            End Get
        End Property
    End Class
End Sub


Pas d'erreurs mais la message box ne s'affiche pas.
j'ai donc raté une étape
Commenter la réponse de cs_oxygene2
Utilisateur anonyme - 17 août 2011 à 16:24
0
Utile
Bonsoir,

Il y a 6 erreurs dans ton code, je me suis permis de le refaire :
Option Strict On
Imports System.Security.Permissions
Imports System.Net
Imports System.Xml.Serialization
Imports System.IO
Imports System.Xml

Public Class Form1
    Dim Liste As Client

    'ACTIONS AU DEMARRAGE   
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
        Etat.Text = " Bienvenue sur "..." & vbCrLf & "Vérification client en cours"

        'téléchargement du xml
        My.Computer.Network.DownloadFile("http://blabla.com/Clients.xml", Application.StartupPath & "\Clients.xml", "", "", False, 100, True)


        'lecture : déserialisation de la classe client
        Dim FluxDeFichierRead As FileStream = File.Open("Clients.xml", FileMode.Open)
        Dim DeSerialiseur As New XmlSerializer(GetType(Client))
        Liste = New Client
        Liste = CType(DeSerialiseur.Deserialize(FluxDeFichierRead), Client)
        FluxDeFichierRead.Close()

        'affichage du pack 1 lu depuis Clients.xml
        MessageBox.Show(Liste.Packs(0).pNom & Environment.NewLine & _
        Liste.Packs(0).pTaille & Environment.NewLine & _
        Liste.Packs(0).pDate.ToString)
    End Sub

    Public Class Client
        Public Packs As New List(Of Pack)
        Sub Add()

        End Sub
        Sub Add(ByVal Packi As Pack)
            Packs.Add(Packi)
        End Sub
    End Class


    Public Class Pack
        Public Nom As String
        Public Taille As Integer
        Public sDate As Date
        Sub New()
        End Sub

        Sub New(ByVal nNom As String, ByVal nTaille As Integer, ByVal nDate As Date)
            Nom = nNom
            Taille = nTaille
            sDate = nDate
        End Sub

        Property pNom() As String
            Set(ByVal value As String)
                Nom = value
            End Set
            Get
                Return Nom
            End Get
        End Property
        Property pTaille() As Integer
            Set(ByVal value As Integer)
                Taille = value
            End Set
            Get
                Return Taille
            End Get
        End Property
        Property pDate() As Date
            Set(ByVal value As Date)
                sDate = value
            End Set
            Get
                Return sDate
            End Get
        End Property
    End Class
End Class
Commenter la réponse de Utilisateur anonyme
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 20 août 2011 à 13:21
0
Utile
Merci bcp banana pour ton aide.
Les erreurs n'étaient pas indiqués au débogage donc je suis passé à coté.

J'ai tout ce qu'il me faut pour continuer mon script.
Commenter la réponse de cs_oxygene2

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.