Linq extraction fichier XML - Fusion de plusieurs champs [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
13509
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 juillet 2019
- 27 juin 2015 à 19:24
Bonjour le forum,

Dans un fichier xml, je dispose d'une arborescence :
        <Application name="A-Q0086H01">
<ExpectedResources>
<ExpectedResource resource="QRES_POST-BI_M3" operator="!">
<Value><![CDATA[14]]></Value>
</ExpectedResource>
<ExpectedResource resource="QRES_FIN_SAUVE" operator="=">
<Value><![CDATA[TRUE]]></Value>
</ExpectedResource>
</ExpectedResources>


Dans la classe principale :
                .Applications = (
From a In d.Descendants("Application")
Select New APP With {
.Name = a.Attribute("name").Value, _
.NameRessourcesApp = If(a.Elements("ExpectedResources").Count() = 0, Nothing, (
From q In a.Elements("ExpectedResources").Elements("ExpectedResource").Attributes("resource")
Select q.Value).ToList()), _
.TypeRessourcesApp = If(a.Elements("ExpectedResources").Count() = 0, Nothing, (
From q In a.Elements("ExpectedResources").Elements("ExpectedResource").Attributes("operator")
Select q.Value).ToList()),

Dans une classe APP :
    Public Property NameRessourcesApp() As List(Of String)
Public ReadOnly Property RessourcesNameApp() As String
Get
If NameRessourcesApp Is Nothing Then
Return Nothing
Else
Return String.Join(" , ", NameRessourcesApp)
End If
End Get
End Property

Public Property TypeRessourcesApp() As List(Of String)
Public ReadOnly Property RessourcesTypeApp() As String
Get
If TypeRessourcesApp Is Nothing Then
Return Nothing
Else
Return String.Join(" [", TypeRessourcesApp)
End If
End Get
End Property

et pour fusionner :
    Public ReadOnly Property RessoucesApp() As String
Get
If parent.RessourcesNameApp Is Nothing And _
parent.RessourcesTypeApp Is Nothing Then
Return Nothing
Else
Return parent.RessourcesNameApp & " [" & parent.RessourcesTypeApp & "]"
End If
End Get
End Property

Dans une colonne d'un DataGridView, j'obtiens :
	RessoucesApp
PRES_0056 [OK]
ici c'est correct car dans App, j'avais simplement un "<ExpectedResource".
Par contre si plusieurs "<ExpectedResource ", j'obtiens :
	RessoucesApp
PRES_PRE-BI_M3 , PRES_FIN_SAUVE [! [=]
au lieu de :
	RessoucesApp
PRES_PRE-BI_M3 [!], PRES_FIN_SAUVE [=]
Question :
Comment procéder pour fusionner les champs "resource" et "operator" ainsi que la(les) values du champ "<Value>" ???

Au final, je souhaiterai obtenir :
	RessoucesApp
PRES_PRE-BI_M3 [!] (le contenu de <![CDATA[14]]>), PRES_FIN_SAUVE [=] (le contenu de <![CDATA[TRUE]]>)
Merci de vos suggestions.

jean-marc
Afficher la suite 

6 réponses

Messages postés
13509
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 juillet 2019
288
0
Merci
Bonjour, même si tu donnes beaucoup d'éléments, il faut que tu précises que tout ça découle des plusieurs autres sujets...
Sinon, il n'y a que moi qui puisse comprendre.

Je n'ai pas trop de temps aujourd'hui, mais je tache de te répondre dans le week-end.

Juste à chaud, puisque la fusion des champ est un "comportement" de la classe Application (même si tu as besoin du résultat dans le Job enfant), j'aurais mis cette concaténation dans la classe Application et dans le Job juste appelé le résultat du parent.
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 Whismeril,

Oui, effectivement, j'ai l'impression que c'est TON forum questions VB Net !!!
Je vais modifier en conséquence mes classes (ENV, APP et JOB).

Merci et bon week-end.

jean-marc
Whismeril
Messages postés
13509
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 juillet 2019
288 -
Ben non pourtant je suis bien plus à l'aise en C#, mais LinqToXml est mon outil de prédilection
Commenter la réponse de cs_JMO
Messages postés
13509
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 juillet 2019
288
0
Merci
J'ai mangé vite fait
Public Class ApplicationJMO
    Public Property Name() As String

    Private privateHost As String
    Public Property Host() As String
        Get
            If String.IsNullOrWhiteSpace(privateHost) Then 'si mon host est vide, je retourne celui de mon parent
                Return Parent.Host
            End If
            Return privateHost
        End Get
        Set(ByVal value As String)
            privateHost = value
        End Set
    End Property


    Public Property Parent() As EnvironnementJMO

    Public Property Jobs() As List(Of Job)

    Public Property Ressources() As List(Of RessourceApp)

    Public ReadOnly Property LesRessources As String
        Get
            Return String.Join(", ", Ressources)
        End Get
    End Property
End Class


Public Class RessourceApp
    Public Property Name() As String

    Public Property Type() As String

    Public Property Valeur() As String

    Public Overrides Function ToString() As String
        Return String.Format("{0} [{1}] {2}", Name, Type,Valeur) 'concaténation d'une ressource dans le ToString de substitution
    End Function
End Class


        Dim maListe As List(Of EnvironnementJMO) = (
            From e In xDoc.Descendants("Environment")
            Select New EnvironnementJMO With {.Name = e.Attribute("name").Value, .Host = e.Attribute("host").Value, .Applications = (
                    From a In e.Descendants("Application")
                    Select New ApplicationJMO With {
                        .Name = a.Attribute("name").Value,
                        .Host = If(a.Attributes("host").Count() > 0, a.Attribute("host").Value, Nothing),
                        .Ressources = (From r In a.Descendants("ExpectedResource")
                                Select New RessourceApp With
                                       {
                                            .Name = r.Attribute("resource").Value,
                                            .Type = r.Attribute("operator").Value,
                                            .Valeur = r.Element("Value").Value
                                        }).ToList(),
                        .Jobs = (
                            From j In a.Descendants("Job")
                            Select New Job With {.Name = j.Attribute("name").Value, .Host = If(j.Attributes("host").Count() > 0, j.Attribute("host").Value, Nothing)}).ToList()}).ToList()}).ToList()

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
merci,
Je vais analyser et tester cet après-midi.

jean-marc
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
Pour l'affichage dans le DataGridView, j'ai ajouté dans la classe JOB :
    Public ReadOnly Property RessourceApp() As String
Get
Return parent.LesRessources
End Get
End Property
Le résultat est presque OK !!!
J'obtiens :
RessourceApp
PRES_0056 [OK] , PRES_0056_TOPFIL [P]
PRES_0046_FIC01 [OK] , PRES_0046_FIC02 [OK]
QRES_PRE-BI_M3 [!] 14, QRES_FIN_SAUVE [=] TRUE ' ici l'exemple <Application name="A-Q0086H01">
QRES_PRE-BI_M3 [!] 10, QRES_FIN_SAUVE [=] TRUE
J'ai un doute sur "[14]" de "<Value><![CDATA[14]]></Value>" qui me semble être un index.

jean-marc
Whismeril
Messages postés
13509
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 juillet 2019
288 -
Ha mais je ne peux pas savoir à ta place à quoi correspond ton fichier
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
Oui, évidemment.
Je regarderai lundi sur l'automate à quoi correspond cet index.
Sujet validé !!!
Merci Whismeril.

jean-marc
Whismeril
Messages postés
13509
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 juillet 2019
288 -
De rien
Commenter la réponse de cs_JMO