Linq extraction fichier XML - Fusion de plusieurs champs

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

6 réponses

Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
27 juin 2015 à 12:11
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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
27 juin 2015 à 12:16
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
27 juin 2015 à 12:17
Ben non pourtant je suis bien plus à l'aise en C#, mais LinqToXml est mon outil de prédilection
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
27 juin 2015 à 13:07
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()

0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
27 juin 2015 à 13:11
merci,
Je vais analyser et tester cet après-midi.

jean-marc
0

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

Posez votre question
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
27 juin 2015 à 15:39
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
27 juin 2015 à 19:03
Ha mais je ne peux pas savoir à ta place à quoi correspond ton fichier
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
27 juin 2015 à 19:07
Oui, évidemment.
Je regarderai lundi sur l'automate à quoi correspond cet index.
Sujet validé !!!
Merci Whismeril.

jean-marc
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
27 juin 2015 à 19:24
De rien
0
Rejoignez-nous