Linq xml - clause where [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
14458
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 juillet 2020
-
Bonjour le Forum,

Je dispose d'un fichier xml dont l'arborescence est la suivante
 <Environments>
    <Environment name="exploitation" ....
      <Applications>
        <Application name="A-P9999H01" ....
          <Jobs>
            <Job name="P9999H0101" ....
            </Job>
            <Job name="P9999H0102" 
            </Job>
          </Jobs>
        </Application>
        <Application name="A-P9999D02" ....
          <Jobs>
            <Job name="P9999D0202" .... 
            </Job>
          </Jobs>
        </Application>
    </Environment>
    <Environment name="production" ....
      <Applications>
        <Application name="A-P1111M01" ....
        ....
        ....
    </Environment>
  </Environments>


La requête
Using reader As New StreamReader("monfichier.xml")
mydoc = XDocument.Load(reader)
End Using

Dim job = (From items In mydoc.Root.Descendants("Environment").Descendants("Application").Descendants("Job") _
Select items)

MessageBox.Show(CStr(job.Count))
me retourne correctement le nombre total de "job".

Je souhaite filtrer le nombre de job par environment.
La requête
Dim job = (From items In MyDoc.Root.Descendants("Environment").Descendants("Application").Descendants("Job") _
Where CStr(items.Elements("Environment").@name) = "exploitation"
Select items)
me retourne 0

Quelle est mon erreur ???
Merci de vos suggestions.

jean-marc

1 réponse

Messages postés
14458
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 juillet 2020
420
Bonjour, un truc du genre

From items In mydoc.Root.Descendants("Environment").where(Function(env) env.Name = "exploitation"


Je n'ai pas de quoi tester sous la main.
Messages postés
14458
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 juillet 2020
420 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

Si tu veux bien poster tyon xml réduit, j'essayerai ce soir.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25 >
Messages postés
14458
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 juillet 2020

Le xml réduit
<?xml version="1.0" encoding="UTF-8"?>
<Domain name="Test jean-marc">
  <Environments>
    <Environment name="exploitation">
      <Applications>
        <Application name="Appli1">
          <Jobs>
            <Job name="appli1_exploitation_Job1">
            </Job>
            <Job name="appli1_exploitation_Job2">
            </Job>
            <Job name="appli1_exploitation_Job3">
            </Job>
            <Job name="appli1_exploitation_Job4">
            </Job>
          </Jobs>
        </Application>
        <Application name="Appli2">
          <Jobs>
            <Job name="appli2_exploitation_Job5">
            </Job>
          </Jobs> 
        </Application>
      </Applications>		
    </Environment>
    <Environment name="production">
      <Applications>
        <Application name="Appli3">
          <Jobs>
            <Job name="appli3_production_Job1">
            </Job>
            <Job name="appli3_production_Job2">
            </Job>
          </Jobs>
        </Application>
        <Application name="Appli4">
          <Jobs>
            <Job name="appli4_production_Job3">
            </Job>
          </Jobs> 
        </Application>
      </Applications>		
    </Environment>	
  </Environments>
</Domain>


Il y 2 environnements (exploitation et production).
L'environnement "exploitation" contient 2 applications et 5 jobs.
L'environnement "production" contient 2 applications et 3 jobs.

        Using reader As New StreamReader(PathRoot & PathExportXML & "export_" & "Test" & ".xml")
            mydoc = XDocument.Load(reader)
        End Using

        Dim job = From items In mydoc.Descendants("Job") _
                  Select items
        MessageBox.Show(CStr(job.Count))
me retourne 8 jobs

Je souhaiterai, dans un premier temps, récupérer le nombre de jobs pour l'environnement "exploitation".
Messages postés
14458
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 juillet 2020
420
        Dim maListe As IEnumerable = (
            From item In xDoc.Descendants("Environment").Where(Function(j) j.@name = "exploitation").Descendants("Job")
            Select item)


me retourne 5 item, je te laisse en faire des Jobs.

Par contre ce n'est pas la peine de mettre toute l'arborescence dans les Descendant(), va direct à celui que tu veux
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25 >
Messages postés
14458
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 juillet 2020

Merci Whismeril de ta réponse.
        Dim countjob As Integer = (
            From item In mydoc.Descendants("Environment").Where(Function(j) j.@name = "exploitation").Descendants("Job")
            Select item).Count

        MessageBox.Show("Nombre de job : " & countjob.ToString)
me retourne correctement le nombre de job pour l'environnement "exploitation".

Ton "Dim maListe As IEnumerable" m'a orienté vers le "Dim countjob As Integer" avec le Count.

Bonne fin de journée et bonne soirée.

jean-marc
Messages postés
14458
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 juillet 2020
420 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

De rien