Linq extraction fichier XML - récupération champ [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
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020
-
Bonjour,

Extrait fichier xml
    <JobApplicationServer name="PRD_M3" comment="Connexion M3 au serveur AS400 de Production" type="M3">
<Properties>
<Property key="VTM3_PASSWORD" value="Klj32+vV"/>
<Property key="VTM3_PORT" value="6800"/>
<Property key="VTM3_SERVER" value="AMO102P"/>
<Property key="VTM3_USER" value="SVA-ZA-VHO"/>
</Properties>
</JobApplicationServer>
Je souhaite extraire la value de la 3 troisième clé de "Property".
Actuellement, j'ai écrit
    Private Function returnHostJob(ByVal e As String) As String
If Not IsNothing(e) Then
Dim myLinkJob = From items In MyDoc.Root.Elements("JobApplicationServers").Elements("JobApplicationServer") _
Where items.Attribute("name").Value = e _
Select items

For Each xEle As XElement In myLinkJob
For i As Integer = 2 To xEle.Elements("Properties").Elements("Property").Attributes("value").Count - 1
Return xEle.Elements("Properties").Elements("Property").Attributes("value")(i).Value & " (" & e & ")"
Exit Function
Next
Next
End If
Return e
End Function
où "e" pour cet exemple correspond à "PRD_M3".
La fonction me retourne correctement "AMO102P".

Question:
Est-ce la bonne méthode pour extraire cette donnée ?
J'en doute !!!


jean-marc

6 réponses

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Suite à re-lecture, j'ai testé
Private Function returnHostJob(ByVal e As String) As String
If Not IsNothing(e) Then
Dim myLinkJob = From items In MyDoc.Root.Elements("JobApplicationServers").Elements("JobApplicationServer") _
Where items.Attribute("name").Value = e _
Select items

Return myLinkJob.Elements("Properties").Elements("Property").Attributes("value")(2).Value & " (" & e & ")"
Exit Function
End If
Return e
End Function
qui me renvoie bien la donnée.
Est-ce la solution ???
Messages postés
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020
465
Salut, tu en as plusieurs des JobApplicationServer?
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
bonjour Whismeril,

Oui, il y en a plusieurs.

Pour les repérer dans le xml
    </JobApplicationServer>
<JobApplicationServer name="PRD_M3" comment="Connexion M3 au serveur AS400 de Production" type="M3">
<Properties>
<Property key="VTM3_PASSWORD" value="Klj32+gG"/>
<Property key="VTM3_PORT" value="6800"/>
<Property key="VTM3_SERVER" value="AMO102P"/>
<Property key="VTM3_USER" value="SVC-ZZ-VT"/>
</Properties>
</JobApplicationServer>
<JobApplicationServer name="REC_M3" comment="Connexion M3 au serveur AS400 de Developpement" type="M3">
<Properties>
<Property ke

et
                        .Jobs = (
From j In a.Descendants("Job")
Select New JOB With {
.EnvironnementApplicationJob = d.@name & "_" & a.@name & "_" & j.@name,
.DDO = returnDDO(d.@name, a.@name, a.@comment), _
.Job = j.@name, _
.RessourcesJobs = (
From l In j.Descendants("ExpectedResource")
Select New RessourceJob With {
.Name = l.@resource,
.Type = l.@operator,
.Valeur = l.Element("Value").Value
}).ToList(),
.JobAppServeur = returnHostJob(If(j.Attributes("jobApplicationServer").Count() > 0,
j.@jobApplicationServer, Nothing)), _
.Serveur = returnHost(If(j.Attributes("host").Count() > 0,
j.@host, Nothing)), _
.TypeJob = returnTypeJob(If(j.Attributes("jobType").Count() > 0, j.@jobType, Nothing)), _
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
J'ai oublié de préciser que je me sers de
<Job name="TEST_CX_M3DEV" retained="0" family="TR2" ... queue="queue_vt2m3" jobType="M3" jobApplicationServer="DEV_M3" mepType="E">
pour repérer si un job dépend d'un jobApplicationServer
Messages postés
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020
465
Bonsoir, je ne suis pas sur de bien comprendre, la liste de jobApplicationServer, est indépendante de ton arborescence (environnement, application, job) dans le fichier xml, mais tu veux renseigner dans les jobs la 3eme valeur de property, c'est bien ça?

Et c'est systématiquement la 3eme, ou celle dont la clé est "VTM3_SERVER" qui pourrait avoir une autre place?
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Bonjour Whismeril,

Oui, la liste JobApllicationServer est indépendante.
  </Icons>
<JobApplicationServers>
<JobApplicationServer name="SMTP_CLIENT" comment="" type="MAIL">
<Properties>
<Property key="VTMAIL_ENCRYPTION" value="none"/>
<Property key="VTMAIL_PASSWORD" value=""/>
<Property key="VTMAIL_PORT" value="25"/>
<Property key="VTMAIL_SERVER" value="172.22.1.50"/>
<Property key="VTMAIL_USE_AUTH" value="false"/>
</Properties>
</JobApplicationServer>
<JobApplicationServer name="PRD_M3" comment="Connexion M3 au serveur AS400 de Production" type="M3">
<Properties>
<Property key="VTM3_PASSWORD" value="Klj32+gG"/>
<Property key="VTM3_PORT" value="6800"/>
<Property key="VTM3_SERVER" value="AMO102P"/>
<Property key="VTM3_USER" value="SVC-ZZ-VT"/>
</Properties>
</JobApplicationServer>
<JobApplicationServer name="REC_M3" comment="Connexion M3 au serveur AS400 de Developpement" type="M3">
<Properties>
<Property key="VTM3_PASSWORD" value="Klj32+gG"/>
<Property key="VTM3_PORT" value="56800"/>
<Property key="VTM3_SERVER" value="AMO303R"/>
<Property key="VTM3_USER" value="SVC-ZZ-VT"/>
</Properties>
</JobApplicationServer>
<JobApplicationServer name="DEV_M3" comment="Connexion M3 au serveur AS400 de Developpement" type="M3">
<Properties>
<Property key="VTM3_PASSWORD" value="Klj32+gG"/>
<Property key="VTM3_PORT" value="36800"/>
<Property key="VTM3_SERVER" value="AMO303R"/>
<Property key="VTM3_USER" value="SVC-ZZ-VT"/>
</Properties>
</JobApplicationServer>
</JobApplicationServers>
</Domain>


Dans l'arborescence, Environnement \ Application \ Job, il y a deux possibilités:
1)
<Job name="P0007J0109" retained="0" family="TR2" comment="BPW : Extraction des donnees PivotLink et envoi sur le FTP"  frequency="D" onDemand="0" isAsked="0" cycleEnabled="0" cycle="00:00:00"  mepType="E">
<Script><![CDATA#c:\VTOM5\SCRIPTS\ROS_Start_Sqlagent_Job.bat]></Script>
<Parameters>
<Parameter><![CDATA[SMO-BI101P\BPW]]></Parameter>
<Parameter><![CDATA[BPW_Send_PivotLink]]></Parameter>
</Parameters>
<Node objectType="job" x="547" y="690"/>
</Job>
Ici, c'est un job classique, sur la ligne "<Job name=", il n'y a pas de " type="M3" ". Le host du serveur est hérité de l'application.

2)
<Job name="P0113H0106" retained="0" family="TR6" comment="ARTICLE HEBDO - Available to Promise. Re-creat" frequency="D" cycleEnabled="0" cycle="00:00:00" queue="queue_vt2m3" jobType="M3" jobApplicationServer="PRD_M3" mepType="E">

Ici, sur la ligne "<Job name=", il y a type="M3" et jobApplicationServer="PRD_M3". Le nom du serveur est donc à aller chercher dans le <JobApplicationServer> correspondant.


Pour l'instant, j'"ai aussi modifié la classe JOB
    Public Property JobAppServeur() As String

Private privateServeur As String
Public Property Serveur() As String
Get
' Si le champ est vide, on retourne celui de son parent
If String.IsNullOrWhiteSpace(privateServeur) Then
Return parent.Serveur
Else
Return privateServeur
End If
End Get
Set(ByVal value As String)
privateServeur = value & JobAppServeur
End Set
End Property
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Capture du formulaire

Messages postés
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020
465
Bonjour,
comme souvent il y a moultes façons de faire, et tu en as trouvé par toi même.
Ce que je ferais, c'est extraire une liste de JobApplicationServer, contant un dictionnaire de Propriete.
Le dictionnaire est une collection qui associe deux données: une clé et une valeur, et dont tu peux retourner une valeur en entrant la clé, je pense que ça colle bien.
Cette extraction serait à faire avant la requête qui crée mesJobs.
Il faudrait modifier la méthode AffecteParent en ajoutant la liste de JobApplicationServer en paramètre et affecterait le host si nécessaire à ce moment là.

Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue
Messages postés
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020
465
Remarque je n'ai jamais essayé d'en faire un depuis linq (xml ou pas) et là je n'ai pas le temps
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 >
Messages postés
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020

Pour le dictionnaire
Private DicoServersM3 As New Dictionary(Of String, String)

Private Sub CreateDicoServersM3()
Dim myServersM3 = From items In MyDoc.Root.Elements("JobApplicationServers").Elements("JobApplicationServer") _
Where items.@type = "M3"
Select items

For Each xEle As XElement In myServersM3
DicoServersM3.Add(xEle.@name, xEle.Elements("Properties").Elements("Property").Attributes("value")(2).Value)
Next xEle
End Sub
        Call CreateDicoServersM3()

For Each kvp As KeyValuePair(Of String, String) In DicoServersM3
TextBox2.Text = TextBox2.Text & kvp.Key & " (" & kvp.Value & ")" & Environment.NewLine
Next kvp

me retourne
PRD_M3 (AMO102P)
REC_M3 (AMO303R)
DEV_M3 (AMO303R)
Messages postés
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020
465 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

Super, ça y est t'es lâché Linq
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 >
Messages postés
15172
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 décembre 2020

Bonjour le Forum,

bonjour Whismeril,

Je suis passé par deux dictionnaires
Private Sub CreateDicoServersM3()
Dim myServersM3 = From items In MyDoc.Root.Elements("JobApplicationServers").Elements("JobApplicationServer") _
Where items.@type = "M3"
Select items

For Each xEle As XElement In myServersM3
DicoServersM3.Add(xEle.@name, xEle.Elements("Properties").Elements("Property").Attributes("value")(2).Value)
Next xEle
End Sub

Private Sub CreateDicoJobsM3()
Dim myJobsM3 = From items In MyDoc.Descendants("Environment").Descendants("Application").Descendants("Job") _
Where items.@jobType = "M3"
Select items

For Each xEle As XElement In myJobsM3
If DicoServersM3.ContainsKey(xEle.@jobApplicationServer) Then
DicoJobsM3.Add(xEle.@name, DicoServersM3(xEle.@jobApplicationServer))
End If
Next xEle
End Sub

.Serveur = returnHost(If(j.Attributes("host").Count() > 0, j.@host, Nothing), j.@name), _
pour la ListOf JOB
et une fonction pour retourner le nom du serveur
Private Function returnHost(ByVal e As String, ByVal name As String) As String
If DicoJobsM3.ContainsKey(name) Then
Return DicoJobsM3(name)
Else
Return e
End If
End Function

Les dictionnaires en VB.Net offrent davantage de possibilité qu'en vbs !!!
Bonne journée,
Je valide ce post.

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

Bonjour,

Les dictionnaires en VB.Net offrent davantage de possibilité qu'en vbs
de façon générale VB.Net offre plus de possibilités que les versions précédentes, heureusement d'ailleurs, sinon à quoi bon évoluer?