Linq extraction fichier XML - ajout ListOf

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 21 juin 2015 à 10:33
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 - 25 juin 2015 à 13:02
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

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
24 juin 2015 à 21:07
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
24 juin 2015 à 21:35
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()),



0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
24 juin 2015 à 21:42
Bonsoir Whismeril,

En remettant le ".ToList" et "Public Property Parametres() As List(Of String)" dans la class "JOB", je n'ai pas d'erreur à l'exécution, mais le champ "Paramètres" ne s'affiche pas dans le DataGridView.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
24 juin 2015 à 22:29
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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
24 juin 2015 à 22:55
Apparemment, il y a blocage sur Child.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
24 juin 2015 à 22:59
Heuu il sort d'où ce Child?
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
24 juin 2015 à 23:50
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
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
25 juin 2015 à 00:41
Dans p, j'ai bien
"-		p	<Parameter><![CDATA[unparametre]]></Parameter>	System.Xml.Linq.XElement
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
25 juin 2015 à 01:47
en image !!!
0

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

Posez votre question
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
25 juin 2015 à 06:48
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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
25 juin 2015 à 12:14
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.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
25 juin 2015 à 12:17
Tu as quelle version de framework?
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
25 juin 2015 à 12:22
bonjour Whismeril,
version 4.0
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
25 juin 2015 à 12:54
Oh, l'idiot, c'est à string.join que je pensais!

0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
25 juin 2015 à 12:59
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
25 juin 2015 à 13:02
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.
0
Rejoignez-nous