Linq extraction fichier XML - ajout ListOf [Résolu]

Signaler
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
-
Bonjour le Forum
et plus particulièrement Whismeril qui m'a plus qu'orienté dans mon précédent post (Linq extraction fichier XML).

Résumé:
Extraction récursive de champs d'un fichier xml pour affichage dans un DataGridView.

Dans la Classe JOB, j'ai déclaré
Public Property Parametres() As List(Of String)


Dans la Sub
Dim maListe As List(Of ENV) = (
From d In xDoc.Descendants("Environment")
Select New ENV With {.Name = d.Attribute("name").Value, _
.Serveur = returnHost(d.Attribute("host").Value), _
.Applications = (
From a In d.Descendants("Application")
Select New APP With {.Name = a.Attribute("name").Value, _
.Serveur = returnHost(If(a.Attributes("host").Count() > 0, a.Attribute("host").Value, Nothing)), _
.Jobs = (
From j In a.Descendants("Job")
Select New JOB With {.Job = j.Attribute("name").Value, _
.Serveur = returnHost(If(j.Attributes("host").Count() > 0, j.Attribute("host").Value, Nothing)), _
.CommentaireApp = If(a.Attributes("comment").Count() > 0, a.Attribute("comment").Value, Nothing), _
.CommentaireJob = If(j.Attributes("comment").Count() > 0, j.Attribute("comment").Value, Nothing), _
.Script = j.Element("Script").Value(),
.Parametres = If(j.Elements("Parameters").Count() = 0, Nothing, (
From p In j.Descendants("Parameter")
Select p.Value).ToList()),
.ModeExecApp = returnGeneric(a.Attribute("mode").Value), _
.ModeExecJob = returnGeneric(j.Attribute("mode").Value), _
}).ToList()}).ToList()}).ToList()

Dim mesJobs As List(Of JOB) = (
From k In maListe, a In k.Applications, j In a.Jobs
Select j.AffecteParent(a, k)).ToList()

DataGridView1.DataSource = mesJobs

Je n'arrive pas à modifier le From de mesJobs pour y inclure le p et donc afficher le champ "Paramètres" (après le champ "Script") dans le DataGridView.

jean-marc

7 réponses

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
Bonsoir le forum,

N'ayant pas réussi à exploiter le ToList du champ paramètres, j'ai essayé ceci:
                            Select New JOB With {
.Parametres = retourParameters(If(j.Elements("Parameters").Count() > 0, j.Elements("Parameters").Value, Nothing))

avec
Public Property Parametres() As String

au lieu de
Public Property Parametres() As List(Of String)

La fonction
    Function retourParameters(ByVal test As String) As String
If test = Nothing Then
Return "champ vide"
Else
Return test
End If
End Function

me retourne tous les paramètres mais concatenés.

Ex:
            <Job name="TEST_CX_M3DEV" retained="0" family="TR2" comment="Job de test Connexion M3 DEV" mepType="E">
<Script><![CDATA#M3#]></Script>
<Parameters>
<Parameter><![CDATA[ZZZ180]]></Parameter>
<Parameter><![CDATA[SVC-ZZ-VT]]></Parameter>
<Parameter><![CDATA[Interface Codes a barres]]></Parameter>
</Parameters>

me retourne
ZZZ180SVC-ZZ-VTInterface Codes a barres

Y a-t-il un moyen d'afficher
ZZZ180 , SVC-ZZ-VT , Interface Codes a barres

Merci pour vos suggestions,
jean-marc
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426
Bonsoir, je n'avais pas vu ton premier post

Est ce que ceci te retourne bien une liste avec tes paramètres?
.Parametres = If(j.Elements("Parameters").Count() = 0, Nothing, (
                       From p In j.Descendants("Parameter")
                       Select p.Value).ToList()),



Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

Que le champ ne s'affiche pas dans le datagridview, c'est normal. On y reviendra.
Avant j'ai besoin de savoir si tu récupères bien les données. Mets un point d'arrêt après la requête et "déroule" les infos jusqu'à un job ou il y doit y avoir des paramètres. Confirme moi s'il sont bien présents.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25 >
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020

Apparemment, il y a blocage sur Child.
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

Heuu il sort d'où ce Child?
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

Ce que je voudrais que tu fasses, c'est à partir d'un point d'arrêt, mettre la souris sur mesJobs et "ouvrir" l'arborescence pour voir si les paramètres sont là, un peu comme ça
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25 >
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020

Je vais me créer un xml restreint pour tester.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
Dans p, j'ai bien
"-		p	<Parameter><![CDATA[unparametre]]></Parameter>	System.Xml.Linq.XElement
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
en image !!!
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426
Bonjour, OK.

Donc comme je te l'ai expliqué dans le sujet précédent, le binding permet d'afficher simplement les propriétés d'une classe, à la condition que ces propriétés ne soient pas des collections.
Une solution simple (là encore) est de serialiser les membres de la collection en ajoutant une propriété (ParamAffiches par exemple), qui retourne
    Public ReadOnly Property ParamAffiches() As String
        Get
            Return String.Format(", ", Parametres)
        End Get

    End Property
C'est ce que tu demandais dan sel second message, mais pour te le proposer, je voulais vérifier la présence des données.

Une alternative est de faire de Parametres un type particulier qui contient une liste de string et réécrire la méthode ToString pour qu'elle retourne le même String.Format. C'est un peu plus long car il va te falloir écrire une classe qui se comporte comme une collection.

Une autre solution est d'ajouter une colonne dont le type de cellule est combobox, mais là il faudra alimenter chaque combo ligne par ligne, le binding ne marche pas.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
Bonjour,

Avec
    Public Property Parametres() As List(Of String)
Public ReadOnly Property ParamAffiches() As String
Get
Return String.Format(", ", Parametres)
End Get
End Property
La colonne "Parametres" est créée, il y a " , " dans tous les champs de cette colonne.

Avec
    Public Property Parametres() As List(Of String)
Public ReadOnly Property ParamAffiches() As String
Get
If Parametres Is Nothing Then
Return "champ vide pour controle"
Else
Return String.Format(", ", Parametres)
End If
End Get
End Property
La colonne "Parametres" est créée, il y a bien "champ vide ..." pour les champs vides mais il y a " , " dans tous les autres champs de cette colonne.

Avec
    Public Property Parametres() As List(Of String)
Public ReadOnly Property ParamAffiches() As String
Get
If Parametres Is Nothing Then
Return "champ vide pour controle"
Else
Return String.Format(", ", "test JMO")
End If
End Get
End Property
La colonne "Parametres" est créée, il y a bien "champ vide ..." pour les champs vides mais il y a " , " dans tous les autres champs de cette colonne.
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426
Tu as quelle version de framework?
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25 >
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020

bonjour Whismeril,
version 4.0
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426
Oh, l'idiot, c'est à string.join que je pensais!

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
Merci !!!
En plus, j'avais regardé split et join sur MSDN.

Je mets ce post à résolu.
Cette méthode va me servir car j'ai d'autres champs du même type à extraire du fichier xml.

jean-marc
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

De rien
C'est justement en vérifiant sur MSDN à partir de quelle framework ça marche avec une liste que je me suis aperçu de mon erreur.
Bonne journée.