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

Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
- - Dernière réponse : Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
- 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
Afficher la suite 

7 réponses

Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23
0
Merci
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
Commenter la réponse de cs_JMO
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289
0
Merci
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()),



Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 > cs_JMO
Messages postés
1855
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.
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23 > Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
-
Apparemment, il y a blocage sur Child.
Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 > cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
Heuu il sort d'où ce Child?
Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 > cs_JMO
Messages postés
1855
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
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23 > Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
-
Je vais me créer un xml restreint pour tester.
Commenter la réponse de Whismeril
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23
0
Merci
Dans p, j'ai bien
"-		p	<Parameter><![CDATA[unparametre]]></Parameter>	System.Xml.Linq.XElement
Commenter la réponse de cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23
0
Merci
en image !!!
Commenter la réponse de cs_JMO
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289
0
Merci
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.
Commenter la réponse de Whismeril
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23
0
Merci
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.
Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 -
Tu as quelle version de framework?
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23 > Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
-
bonjour Whismeril,
version 4.0
Commenter la réponse de cs_JMO
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289
0
Merci
Oh, l'idiot, c'est à string.join que je pensais!

cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
23 -
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
Whismeril
Messages postés
13519
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 > cs_JMO
Messages postés
1855
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.
Commenter la réponse de Whismeril