"Lourdingue pour nous" ? Je sais pas si tu parles au nom de toute la communauté AutoIt, mais j'espère en faire partie, et je ne suis pas d'accord avec toi.
C'est clair, ça demande pas mal de rigueur. Il n’empêche que le XML, bien maîtrisé (et passons sur les fioritures du genre XSD DTD et XSLT) est beaucoup plus représentatif d'un modèle pouvant être très complexe que peuvent l'être nombre de langages ou structures de description. On peut prendre l'exemple de Matwachich justement, comment modéliser proprement une arborescence, dont on ne connait pas la profondeur de base? C'est cool les .ini quand on a un seul niveau (la section est un répertoire, la clef est un fichier), mais dès qu'on a des sousdossier, bonjour la cagade.
Je comprends qu'on puisse se taper la tête contre un mûr, mais le résultat est bien souvent mieux fait (et surtout PORTABLE ! Bah ouais, tout ne tourne pas autour d'AutoIt ^^).
Bref, sans plus attendre, voici le code :
► Afficher le texteConstruction arborescence en fonction d'un XML
Code : Tout sélectionner
; Créé par ZDS
; Compatible avec AutoIt v3.3.6.1
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
#include <StaticConstants.au3>
#Region Fonctions de traitement XML
Func XML_getProjects($file)
Local $resultat[1] = [0], $XML = ObjCreate("Microsoft.XMLDOM")
If IsObj($XML) And FileExists($file) Then
$XML.Load($file)
Local $projects = $XML.SelectNodes("/Project")
For $project In $projects
$resultat[0] = $resultat[0] + 1
ReDim $resultat[$resultat[0]+1]
$resultat[$resultat[0]] = $project
Next
EndIf
Return $resultat
EndFunc
Func XML_getFolders($node)
Local $resultat[1] = [0]
Local $folders = $node.SelectNodes("Folder")
For $folder In $folders
$resultat[0] = $resultat[0] + 1
ReDim $resultat[$resultat[0]+1]
$resultat[$resultat[0]] = $folder
Next
Return $resultat
EndFunc
Func XML_getFiles($node)
Local $resultat[1] = [0]
Local $files = $node.SelectNodes("File")
For $file In $files
$resultat[0] = $resultat[0] + 1
ReDim $resultat[$resultat[0]+1]
$resultat[$resultat[0]] = $file
Next
Return $resultat
EndFunc
Func XML_getDisplayName($node)
Switch StringUpper($node.nodeName())
Case "PROJECT"
Return $node.getAttribute("name")
Case "FOLDER"
Return $node.getAttribute("name")
Case "FILE"
Return $node.getAttribute("path")
EndSwitch
Return ""
EndFunc
#EndRegion
Example()
Func Example()
Local $GUI = GUICreate("Treeview-XML", 350, 415)
Local $treeview = GUICtrlCreateTreeView(6, 6, 300, 350)
buildTreeview($treeview, @ScriptDir & "\" & "Treeview-XML.xml")
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ExitLoop
Case Else
; ???
EndSelect
WEnd
GUIDelete()
EndFunc
Func buildTreeview($treeview, $file)
Local $projects = XML_getProjects($file)
For $i = 1 To $projects[0]
Local $project = $projects[$i]
Local $control = GUICtrlCreateTreeViewItem(XML_getDisplayName($project), $treeview)
buildSubTreeview($control, $project)
Next
EndFunc
Func buildSubTreeview($control, $node)
Local $folders = XML_getFolders($node)
For $i = 1 To $folders[0]
Local $folder = $folders[$i]
Local $subcontrol = GUICtrlCreateTreeViewItem(XML_getDisplayName($folder), $control)
buildSubTreeview($subcontrol, $folder)
Next
Local $files = XML_getFiles($node)
For $i = 1 To $files[0]
Local $file = $files[$i]
Local $subcontrol = GUICtrlCreateTreeViewItem(XML_getDisplayName($file), $control)
Next
EndFunc
A bientôt, et si besoin n'hésite pas à me demander d'autres renseignements.
PS: J'ai volontairement cloisonné les actions, et utilisé des tableaux de type 1-based, afin d'avoir une certaine cohérence entre deux passages de fonctions. Les trucs purement XML sont préfixés par ... "XML" ^^ les fonctions qui construisent l'arbo sont préfixées par "build". Bye !
PS2 : Je me suis basé sur ton fichier XML de départ, pas sur le fichier de TopXm, afin que tu puisses garder la compatibilité avec "Programmer's Notepad".
PS3 : Paradoxalement, Chewbacca n'est jamais vraiment à poil... Etonnant, non?
EDIT: Je joins les deux fichiers correspondants, histoire de pouvoir tester sans avoir a les recréer à la main (et oublier l'entête du fichier XML comme j'ai pu le faire tout à l'heure ^^)