[R]Extraire les donnée d'un .xml --> listView

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

[R]Extraire les donnée d'un .xml --> listView

#1

Message par Doctox »

Bonjour/Bonsoir,

J'aimerais comme l'indique le titre récupérer les donnée enregistrer dans un .XML pour ensuite les afficher dans une listview

j'ai essayé beaucoup de méthode venant d'un UDF :"XML.au3" . Malheureusement n'étant pas très doué, je galère pas mal et je n'arrive a rien récupérer, au bout de 2 jours dans les quels j'ai tourné en rond sur google et ce forum pour trouver des réponses , je m'avoue vaincu et vous poses la question.


Voici mon document XML : CommandeReception.xml
<listview>
   <item>
      <date>08/02/2020-18:44:02</date>
      <fournisseur>Xfournisseur</fournisseur>
      <refproduit>Xrefproduit</refproduit>
      <quantité>1</quantité>
      <chantier>Xchantier</chantier>
   </item>

</listview>
Et ici le code que j'ai commencé a faire mais qui ne donne rien =/
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <EditConstants.au3>
#include <GuiListView.au3>
#include <FileConstants.au3>
#include <WinAPIFiles.au3>
#include <Array.au3>
#include <File.au3>
#include "IncludeXml\XML.au3"


Global $FileReception = @scriptDir&"\CommandeReception.xml"
Global $columns = "Date|Fournisseur|Ref produit|Quantité|Chantier"


$Gui_Reception = GUICreate("Reception", 750, 700)
$ListView2 = GUICtrlCreateListView($columns, 50, 200, 650, 300, -1)

$info_xml = _XML_GetChildText($FileReception, "listview/")
$item1 = GUICtrlCreateListViewItem($info_xml, $ListView2)
GUISetState(@SW_SHOW)
While 1
   $nMsg3 = GUIGetMsg()
   Switch $nMsg3
      Case $GUI_EVENT_CLOSE
         GUIDelete($Gui_Reception)

   EndSwitch
WEnd
 
(il y a beaucoup d'include car j'ai essayé pas mal de chose)

Je m'excuse d'avance si jamais j'ai loupé un sujet sur le fofo qui répondrais a cette question mais j'ai fait un bon tour et soit je n'ai pas compris les information soit elle n'allais pas dans le sens que je voulais.

Je vous remercie de m'avoir lue et espère avoir une réponse =)
Modifié en dernier par Doctox le dim. 09 févr. 2020 19:07, modifié 1 fois.
Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6020
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#2

Message par mikell »

Il ya des alternatives aux udf *xml
Il faudrait poster un exemple du VRAI xml et aussi du résultat attendu
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11570
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#3

Message par Tlem »

Bonjour.
Si le XML est tel que présenté (9 lignes dont 5 lignes d'infos à récupérer), je simplifierais de la sorte (AMHA, c'est ce à quoi Mikel pensait :bisou: ) :

Code : Tout sélectionner

Global $XMLFile = FileRead("Test.xml")

$Date = GetXMLData("Date")
$Fournisseur = GetXMLData("fournisseur")
$RefProduit = GetXMLData("refproduit")
$Quantite = GetXMLData("quantité")
$Chantier = GetXMLData("chantier")

MsgBox(0,"", "Date = " & $Date & @CRLF & "Fournisseur = " & $Fournisseur & @CRLF & "RefProduit = " & $RefProduit & @CRLF & "Quantité = " & $Quantite & @CRLF & "Chantier = " & $Chantier)


Func GetXMLData($Tag)
	Local $TagData = StringRegExp($XMLFile,"(?i)<" & $Tag & ">(.*)<\/" & $Tag & ">", 1)
	If IsArray($TagData) Then
		Return $TagData[0]
	Else
		Return ""
	EndIf
EndFunc
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#4

Message par Doctox »

Merci pour vos réponse, j'essaie de mettre en place ta solution "simple" et souvent les solutions les plus simple sont les meilleurs =)

Pour répondre quand même à Mikel : c'est plus où moins la seul chose qu'il y aura des items avec des dates, fournisseur, chantier, refproduit et quantité. Les uns au dessus des autres et je voudrais faire une gui où il s'afficherait tous pour faire un genre d'historique.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11570
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#5

Message par Tlem »

Est-ce que le fichier XML contiendra plusieurs Items ?
Si oui, alors il faut adapter la solution "simple". ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#6

Message par Doctox »

oui je suis entrain de l'adapter avec quelque chose de ce genre ?

Global $columns = "Date|Fournisseur|Ref produit|Quantité|Chantier"
Global $XMLFileCommandeReception = FileRead("CommandeReception.xml")

$Gui_Reception = GUICreate("Reception", 750, 700)
$ListView2 = GUICtrlCreateListView($columns, 50, 200, 650, 300, -1)

$DateReception = GetXMLData("Date")
$FournisseurReception = GetXMLData("fournisseur")
$RefProduitReception = GetXMLData("refproduit")
$QuantiteReception = GetXMLData("quantité")
$ChantierReception = GetXMLData("chantier")

$ItemReception = $DateReception&"|"&$FournisseurReception&"|"&$RefProduitReception&"|"&$QuantiteReception&"|"&$ChantierReception
$item1 = GUICtrlCreateListViewItem("", $ListView2)
For $i = 1 To $ItemReception[0]
      GUICtrlSetData($ListView2, $ItemReception[$i],"|")
Next
 
Mais je me tape une error sur
For $i = 1 To $ItemReception[0]
For $i = 1 To $ItemReception^ ERROR

Donc je farfouille autour =)
Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6020
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#7

Message par mikell »

C'est fait à l'arrache (le match a repris :mrgreen: ) mais c'est pour le concept

Global $columns = "Date|Fournisseur|Ref produit|Quantité|Chantier"
Global $XMLFileCommandeReception = FileRead("CommandeReception.xml")

$Gui_Reception = GUICreate("Reception", 750, 700)
$ListView2 = GUICtrlCreateListView($columns, 50, 200, 650, 300, -1)

$split = StringSplit( $XMLFileCommandeReception, "</item>", 1)
For $i = 1 to $split[0]

$DateReception = GetXMLData($split[$i], "Date")
$FournisseurReception = GetXMLData($split[$i], "fournisseur")
$RefProduitReception = GetXMLData($split[$i], "refproduit")
$QuantiteReception = GetXMLData($split[$i], "quantité")
$ChantierReception = GetXMLData($split[$i], "chantier")

$ItemReception = $DateReception&"|"&$FournisseurReception&"|"&$RefProduitReception&"|"&$QuantiteReception&"|"&$ChantierReception
$item1 = GUICtrlCreateListViewItem($ItemReception, $ListView2)

Next
 GuiSetState()


While 1
Wend


Func GetXMLData($txt, $Tag)
   Local $TagData = StringRegExp($txt,'(?i)<' & $Tag & '>([^<]+)', 1)
   Return (@error ? "" : $TagData[0])
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11570
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#8

Message par Tlem »

Si dés le départ vous aviez indiqué qu'il y a plusieurs Items dans votre fichier XML, on aurait gagné un peut de temps. Pour le coup, Mikell avait sans doute anticipé. :roll:

Modifiez le code comme ceci :

Code : Tout sélectionner

Global $XMLFile = FileRead("Test.xml")

$aDate = GetXMLData("date")
$aFournisseur = GetXMLData("fournisseur")
$aRefProduit = GetXMLData("refproduit")
$aQuantite = GetXMLData("quantité")
$aChantier = GetXMLData("chantier")

For $i = 0 to Ubound($aDate)
MsgBox(0,"", "Date = " & $aDate[$i] & @CRLF & "Fournisseur = " & $aFournisseur[$i] & @CRLF & "RefProduit = " & $aRefProduit[$i] & @CRLF & "Quantité = " & $aQuantite[$i] & @CRLF & "Chantier = " & $aChantier[$i])
Next


Func GetXMLData($Tag)
	Local $aTagData = StringRegExp($XMLFile,"(?i)<" & $Tag &">(.*)<\/" & $Tag & ">",3)
	If IsArray($aTagData) Then
		Return $aTagData
	Else
		Return ""
	EndIf
EndFunc
Edit : Grillé par Mikell. :D
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#9

Message par Doctox »

Merci a vous deux pour le temps que vous me consacrez =) désolé pour le manque d'infos
Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6020
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#10

Message par mikell »

@Thierry : For $i = 0 to Ubound($aDate) - 1
:mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11570
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Extraire les donnée d'un .xml --> listView

#11

Message par Tlem »

Ha oui. J'avais zoublié. :wink:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

Re: [R]Extraire les donnée d'un .xml --> listView

#12

Message par Doctox »

Bonjour,

Désolé de remettre le sujet en avant mais après utilisation, j'ai un petit soucie avec des entrée "Fantôme", il y a des entrée avec juste les nom de Tag ("date" "nom fourni" ect...) mais rien a l’interrieur, je me demandais si il y avais moyen de l'obliger a prendre que si il y a une infos entre les tag ?

Peut être avec une combine du StringRegExp, mais j'avoue que je comprend rien aux différentes façons de l'utiliser, les "(.?)" j'ai du mal

Encore merci pour l'aide apporté =)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11570
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R]Extraire les donnée d'un .xml --> listView

#13

Message par Tlem »

A partir de quand/quoi, considérez vous l'entrée comme une entrée fantôme ?
s'il manque un, deux, trois, ou tous les éléments ?
Quel code avez-vous adopté ?
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

Re: [R]Extraire les donnée d'un .xml --> listView

#14

Message par Doctox »

alors exemple d'entrée fantôme :
<item>
   <date></date>
   <fournisseur></fournisseur>
   <refproduit></refproduit>
   <qté></qté>
   <chantier></chantier>
</item>
exemple d'entrée complète :
<item>
   <date>17/02/2020-10:08:32</date>
   <fournisseur>Peltier</fournisseur>
   <refproduit>dsfsdf</refproduit>
   <qté>1</qté>
   <chantier>Bourron</chantier>
</item>
J'ai opté pour cette version :
$splitRecep = StringSplit( $XMLFileCommandeEnCour, "</item>", 1)
For $i = 1 to $splitRecep[0]
$EncoursReception = "Reception"
$DateReception = GetXMLData($splitRecep[$i], "Date")
$FournisseurReception = GetXMLData($splitRecep[$i], "fournisseur")
$RefProduitReception = GetXMLData($splitRecep[$i], "refproduit")
$QuantiteReception = GetXMLData($splitRecep[$i], "qté")
$ChantierReception = GetXMLData($splitRecep[$i], "chantier")
$ItemReception = $DateReception&"|"&$FournisseurReception&"|"&$RefProduitReception&"|"&$QuantiteReception&"|"&$ChantierReception&"|"&$EncoursReception
$item1 = GUICtrlCreateListViewItem($ItemReception, $ListCommande)


Func GetXMLData($txt, $Tag)
        Local $TagData = StringRegExp($txt,'(?i)<' & $Tag & '>([^<]+)', 1)
        Return (@error ? "" : $TagData[0])
EndFunc
Merci de m'accorder de votre temps =)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11570
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R]Extraire les donnée d'un .xml --> listView  

#15

Message par Tlem »

Vous ne répondez pas entièrement à mes questions. Du coup on va extrapoler. ^^

Cas N°1 : Rien que la date est vide => Entrée fantôme (peux être adapté à n'importe quelle autre variable si la date n'est pas le critère principal).

Code : Tout sélectionner

...
$DateReception = GetXMLData($splitRecep[$i], "Date")
If $DateReception = "" Then ContinueLoop
...
Cas N°2 : Tous les éléments sont vides => Entrée fantôme (sous entend que si un seul des éléments n'est pas vide alors l'entrée est valide).

Code : Tout sélectionner

...
$ChantierReception = GetXMLData($splitRecep[$i], "chantier")
If $DateReception & $FournisseurReception & $RefProduitReception & $QuantiteReception & $ChantierReception  = "" Then ContinueLoop
...
Cas N°3 : Si un seul des éléments est vide => Entrée fantôme.

Code : Tout sélectionner

...
$ChantierReception = GetXMLData($splitRecep[$i], "chantier")
If $DateReception = "" Or $FournisseurReception = "" Or $RefProduitReception = "" Or $QuantiteReception = "" Or $ChantierReception  = "" Then ContinueLoop
...
[/code2]
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

Re: [R]Extraire les donnée d'un .xml --> listView

#16

Message par Doctox »

Bonjour,

Le cas N°2 répond entièrement a ma demande et j'avoue que maintenant que je le voie j'aurais pue rajouter cette condition moi même, je me suis pris le chou a tourner autour du "StringRegExp".

Merci =)
Doctox
Niveau 1
Niveau 1
Messages : 10
Enregistré le : dim. 09 févr. 2020 13:31
Status : Hors ligne

Re: [R]Extraire les donnée d'un .xml --> listView

#17

Message par Doctox »

ReBonjour,

Nouvelle question, je vais essayer pour une fois d'être précis :
j'ai fait une pointeuse où chaque employés ce présente pointe, va travailler puis a la fin de journée re-viens, mets sur quel projet il a travaillé et combien de temps, puis pointe sa fin de journée. Je récupère sa dans un XML qui ressemble a sa pour 1 employé :

<item>
   <date>18/02/2020</date>
   <debut>15H35</debut>
   <nomProjet1>boutet</nomProjet1>
   <tempsProjet1>5H</tempsProjet1>
   <fin>15H35</fin>
</item>

<item>
   <date>19/02/2020</date>
   <debut>15H35</debut>
   <nomProjet1>StJames</nomProjet1>
   <tempsProjet1>5H</tempsProjet1>
   <nomProjet2>loti</nomProjet2>
   <tempsProjet2>4H</tempsProjet2>
   <fin>15H35</fin>
</item>
 
Jusque là tout vas bien, j'aimerais maintenant récupérer et les mettre ces infos dans une listview, jusqu'ici on est encore OK.

Mon problème est le suivant j'aimerais que projet 1 et projet 2 (il peux y avoir jusqu'a 5projets et temps de projets) soit dans la même colone mais a une ligne en dessous et la sa coince je vous fait un montage du rendu que j'aimerais avoir :

Image

Edit : et pour être précis je voudrais trier les résultats en cliquant sur l'onglet, voila pourquoi j'aimerais que sa aille sur la ligne suivante

Est il possible d'avoir ce genre de rendu ? Si non, connaissez vous une solution qui m'aiderais a avancer ? car je stagne la dessus malheureusement =/

Edit 1 : voici le bout de code que je triture =)

$splitguillaume = StringSplit( $XMLFilePointeuseGuillaume, "</item>", 1)
For $i = 1 to $splitguillaume[0]
$guillaume = "Guillaume"
$Dateguillaume = GetXMLData($splitguillaume[$i], "date")
$Debutguillaume = GetXMLData($splitguillaume[$i], "debut")
$NomProjet1guillaume = GetXMLData($splitguillaume[$i], "nomProjet1")
$NomProjet2guillaume = GetXMLData($splitguillaume[$i], "nomProjet2")
$TempsProjet1guillaume = GetXMLData($splitguillaume[$i], "tempsProjet1")
$Finguillaume = GetXMLData($splitguillaume[$i], "fin")
$Itemguillaume = $Dateguillaume&"|"&$Debutguillaume&"|"&$NomProjet1guillaume&@CR&$NomProjet2guillaume&"|"&$TempsProjet1guillaume&"|"&$Finguillaume&"|"&$guillaume
$item4 = GUICtrlCreateListViewItem($Itemguillaume, $ListPersonnel)
Next

Func GetXMLData($txt, $Tag)
        Local $TagData = StringRegExp($txt,'(?i)<' & $Tag & '>([^<]+)', 1)
        Return (@error ? "" : $TagData[0])
EndFunc
 
Merci encore de prendre de votre temps pour mes problématiques =), je reste bien entendu disponible si jamais vous avez des questions et m'excuse si je n'ai pas été suffisamment claire.

Edit 2 : j'ai trouvé a force de trifouiller (je le donne si jamais quelqu'un en aurait besoins) :
$splitguillaume = StringSplit( $XMLFilePointeuseGuillaume, "</item>", 1)
For $i = 1 to $splitguillaume[0]
$guillaume = "Guillaume"
$Dateguillaume = GetXMLData($splitguillaume[$i], "date")
$Debutguillaume = GetXMLData($splitguillaume[$i], "debut")
$NomProjet1guillaume = GetXMLData($splitguillaume[$i], "nomProjet1")
$NomProjet2guillaume = GetXMLData($splitguillaume[$i], "nomProjet2")
$TempsProjet1guillaume = GetXMLData($splitguillaume[$i], "tempsProjet1")
$Finguillaume = GetXMLData($splitguillaume[$i], "fin")
$Itemguillaume = $Dateguillaume&"|"&$Debutguillaume&"|"&$NomProjet1guillaume&"|"&$TempsProjet1guillaume&"|"&$Finguillaume&"|"&$guillaume

$item4 = GUICtrlCreateListViewItem($Itemguillaume, $ListPersonnel)
If $NomProjet2guillaume = Not Null Then
   $Itemguillaume2 = ""&"|"&""&"|"&$NomProjet2guillaume&"|"&""&"|"&""&"|"&""
   $item5 = GUICtrlCreateListViewItem($Itemguillaume2, $ListPersonnel)
EndIf
Next
 
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11570
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R]Extraire les donnée d'un .xml --> listView

#18

Message par Tlem »

Bonsoir Doctox, merci de créer un nouveau sujet lorsque vous posez une nouvelle question.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre