Lecture xml complexe via dataset

beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010 - 18 juil. 2010 à 11:06
sebguig34 Messages postés 3 Date d'inscription vendredi 9 septembre 2011 Statut Membre Dernière intervention 10 septembre 2011 - 10 sept. 2011 à 16:07
Hello tout le monde,

Je coince sur la lecture de fichiers xml complexes..

Voici le xml :




1
Julien


20
m


42


1.75






2
Anne


18
f


1.67


90


60
90






3
Marc


m


44


1.82






j'ai besoin de lire le xml et de mettre dans un listview (1 personne = 1 ligne) les infos suivantes :
id, prenom, age, sexe, pointure, hauteur, tour de poitrine, tour de taille tour des anches

ce que je n'arrive pas a faire :

parcourir le xml et prendre les valeurs de chaque sous ensemble (infos, taille, mensurations).
ensuite, je pense que vous avez vu, Julien n'a pas de sous table "mensuration", et que Anne, dans la sous table "taille" n'a pas de balise "pointure" et Marc n'a pas d'age.

Est-ce que qqn pourrai m'aider avec un code ?

Merci beaucoup

++

7 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
18 juil. 2010 à 12:12
Bonjour,

Je pense, s'il est possible, qu'il serait préférable d'avoir un shéma du type :

<?xml version="1.0" standalone="yes"?>
<qui xmlns="http://tempuri.org/qui.xsd">
  
    1
    Toto


    28
    <sexe>m</sexe>
    41


    <taille>1.78</taille>
  


  
    2
    Tata


    25
    <sexe>f</sexe>
    38


    <taille>1.75</taille>
    80


    <tourTaille>60</tourTaille>
    <hanches>80</hanches>
  


</qui>


Vous n'auriez qu'a créer un dataset "qui" contenant une DataTable "personne" avec les différentes propriétés

Ensuite un simple
MonDataSet.ReadXml("MonXml.xml")

pour le charger

MonDataSet.WriteXml("MonXml.xml")

pour l'enregistrer

et
For Each p As qui.personneRow In MonDataSet.personne
 
Next


pour remplir la listView
0
beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010
19 juil. 2010 à 14:48
Merci pour la réponse, mais le xml est imposé, donc je n'ai pas le choix de la structure du xml.

Donc si qqn sait comment faire, il est le bienvenue !
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
19 juil. 2010 à 16:28
Si le schéma est imposé, dans ce cas il va falloir parcourir l'arbre DOM à l'aide d'un objet XMLDocument ou par un XmlReader.

Le plus propre est de créer par exemple les classes :
Imports System.Xml

Public Class Infos

    Public id As Integer
    Public prenom As String
    Public age As Integer
    Public sexe As String

    Public Sub New(ByVal id, ByVal prenom, ByVal age, ByVal sexe)
        id = id
        prenom = prenom
        age = age
        sexe = sexe
    End Sub

    Public Sub New(ByVal noeud As XmlElement)
        For Each subNode As XmlElement In noeud.ChildNodes
            Select Case subNode.Name
                Case "id"
                    id = XmlConvert.ToInt32(subNode.InnerText)
                Case "prenom"
                    prenom = subNode.InnerText
                Case "age"
                    age = XmlConvert.ToInt32(subNode.InnerText)
                Case "sexe"
                    sexe = subNode.InnerText
            End Select
        Next
    End Sub

End Class

Public Class Taille

    Public pointure As Integer
    Public hauteur As Single

    Public Sub New(ByVal pointure As Integer, ByVal hauteur As Single)
        pointure = pointure
        hauteur = hauteur
    End Sub

    Public Sub New(ByVal noeud As XmlElement)
        For Each subNode As XmlElement In noeud.ChildNodes
            Select Case subNode.Name
                Case "pointure"
                    pointure = XmlConvert.ToInt32(subNode.InnerText)
                Case "hauteur"
                    hauteur = XmlConvert.ToSingle(subNode.InnerText)
            End Select
        Next
    End Sub

End Class

Public Class Mensurations

    Public poitrine As Integer
    Public taille As Integer
    Public hanches As Integer

    Public Sub New(ByVal poitrine As Integer, ByVal taille As Integer, ByVal hanches As Integer)
        poitrine = poitrine
        taille = taille
        hanches = hanches
    End Sub

    Public Sub New(ByVal noeud As XmlElement)
        For Each subNode As XmlElement In noeud.ChildNodes
            Select Case subNode.Name
                Case "poitrine"
                    poitrine = XmlConvert.ToInt32(subNode.InnerText)
                Case "taille"
                    taille = XmlConvert.ToInt32(subNode.InnerText)
                Case "hanches"
                    hanches = XmlConvert.ToInt32(subNode.InnerText)
            End Select
        Next
    End Sub

End Class

Public Class Personne

    Private _infos As Infos
    Private _taille As Taille
    Private _mensurations As Mensurations

    Public Property Infos() As Infos
        Get
            Return _infos
        End Get
        Set(ByVal value As Infos)
            _infos = value
        End Set
    End Property

    Public Property Taille() As Taille
        Get
            Return _taille
        End Get
        Set(ByVal value As Taille)
            _taille = value
        End Set
    End Property

    Public Property Mensurations() As Mensurations
        Get
            Return _mensurations
        End Get
        Set(ByVal value As Mensurations)
            _mensurations = value
        End Set
    End Property

    Public Sub New(ByVal infos As Infos, ByVal taille As Taille, ByVal mensurations As Mensurations)
        _infos = infos
        _taille = taille
        _mensurations = mensurations
    End Sub

    Public Sub New(ByVal noeud As XmlElement)
        _infos = Nothing
        _taille = Nothing
        _mensurations = Nothing

        For Each subNode As XmlElement In noeud.ChildNodes
            Select Case subNode.Name
                Case "infos"
                    _infos = New Infos(subNode)
                Case "taille"
                    _taille = New Taille(subNode)
                Case "mensurations"
                    _mensurations = New Mensurations(subNode)
            End Select
        Next
    End Sub

End Class


Ceci afin d'avoir des objets .net qui représentent les différents noeud

Ensuite on peut créer une fonctions :
Private Function LoadXML() As List(Of Personne)
        Dim doc As New XmlDocument()
        doc.Load("C:\tmp.xml")
        Dim lst As New List(Of Personne)

        For Each elm As XmlElement In doc.DocumentElement.ChildNodes
            lst.Add(New Personne(elm))
        Next

        Return lst
End Function


qui va parcourir le fichier xml est créer les éléments "Personne" afin de les ajouter à une liste de personnes.

Enfin on pourra ecrire une sub pour remplir le ListView.
Exemple :
Dim lst As List(Of Personne) = LoadXML()
        Dim res As String

        For Each p As Personne In lst
            res = ""
            If p.Infos IsNot Nothing Then
                res String.Format("Infos : id {0} ; prenom = {1} ; age = {2} ; sexe = {3}", p.Infos.id, p.Infos.prenom, p.Infos.age, p.Infos.sexe)
                res = res & vbNewLine
            End If
            If p.Taille IsNot Nothing Then
                res &String.Format("Taille : pointure {0} ; hauteur = {1}", p.Taille.pointure, p.Taille.hauteur)
                res &= vbNewLine
            End If
            If p.Mensurations IsNot Nothing Then
                res &String.Format("Mensurations : poitrine {0} ; taille = {1} ; hanches = {2}", p.Mensurations.poitrine, p.Mensurations.taille, p.Mensurations.hanches)
                res &= vbNewLine
            End If
            MsgBox(res)
        Next


S'il y a des erreurs désolé, j'ai écrit ca vite fait
0
beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010
19 juil. 2010 à 16:36
wow :) merci

je teste et je tiens au courant :)

merci encore
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
19 juil. 2010 à 16:44
faite juste attention, dans le code xml que vous avez posté il y a des erreurs de balise.

1) La balise de fermeture de mensurations </mensuration> il manque un s
2) Pour Marc vous avez mis pieds au lieu de pointure (ca peut marcher aussi si dans le constructeur de taille on met 'Case "pointure", "pieds"')
0
sebguig34 Messages postés 3 Date d'inscription vendredi 9 septembre 2011 Statut Membre Dernière intervention 10 septembre 2011
9 sept. 2011 à 15:04
Bonjour,
j'ai un peu le même soucis avec un fichier xml qui m'arrive par des personnes exterieures.
Mon dataset charge sans problèmes les fichiers avec prologue (tempuri.org)
<?xml version="1.0" standalone="yes"?>
<moi xmlns="http://tempuri.org/moi.xsd">

Les autres fichiers xml à importer sont :
<?xml version="1.0" ?>
<Story xmlns="http://domaine/story.xsd">.

avez-vous une idée, comment je pourrai indiquer lors du chargement (filepath) que "domaine" est valable éqalement.
J'ai essayé avec la fonction replace,ça ne donne pas grand chose
0
sebguig34 Messages postés 3 Date d'inscription vendredi 9 septembre 2011 Statut Membre Dernière intervention 10 septembre 2011
10 sept. 2011 à 16:07
Désolé pour le dérangement, j'ai fini par crée un convertisseur xml
0
Rejoignez-nous