Page 1 sur 1
[R] XML <-> TreeView
Posté : jeu. 26 janv. 2012 01:39
par matwachich
Salut à tous!
Alors voila, je me lance dans la création d'un gestionnaire de projet pour Scite.
Cela fait longtemps que j'ai arrêté d'utiliser Scite au profit de Programmer's Notepad rien que pour le gestionnaire de projet intégré, mais je me rend compte que Scite possède des trucs vraiment géniaux!
Pour cela, j'ai besoin de pouvoir stocker le projet dans un fichier, j'ai envi d'utiliser le format xml, mais voila je n'y connais rien!
J'ai pas trouvé de tuto concluant, et l'UDF _XMLDomWrapper.au3 est plutôt vague!
J'aimerai utiliser un format compatible avec le format de Programmer's Notepad, qui ressemble à cela:
► Afficher le texte
Code : Tout sélectionner
<Project name="Mon Projet">
<File path="c:\Config.au3"></File>
<File path="c:\Globals.au3"></File>
<File path="c:\Db.au3"></File>
<Folder name="Dossier">
<File path="c:\GUI.au3"></File>
<File path="c:\Lang.au3"></File>
<File path="c:\Notif.au3"></File>
<File path="c:\Server.au3"></File>
</Folder>
</Project>
J'aimerai SVP un exemple (une fonction) qui charge le contenu de ce fichier XML dans un TreeView, genre:
Code : Tout sélectionner
+- Mon Projet
|-- + Dossier
|-- GUI.au3
|-- Lang.au3
|-- Notif.au3
|-- Server.au3
|-- Config.au3
|-- Globals.au3
|-- Db.au3
MERCI!
Re: [..] XML <-> TreeView
Posté : jeu. 26 janv. 2012 08:07
par Tlem
Pour le TreeView, je suis sur que vous savez comment faire à partir d'un tableau ...
Pour l'utilisation du
_XMLDomWrapper, j'ai aussi du mal à comprendre. Maintenant, vous avez des exemples tout fait sur le forum US :
http://www.autoitscript.com/forum/topic ... _p__567756
Re: [..] XML <-> TreeView
Posté : jeu. 26 janv. 2012 11:34
par ricky
Re: [..] XML <-> TreeView
Posté : jeu. 26 janv. 2012 12:31
par TopXm
Hello
Vu que ça m'intéressais l'histoire du XML j'ai regardé vite fait cette page :
http://msdn.microsoft.com/fr-fr/library ... aspx#HowDo
Du coup j'ai voulu tester rien que la lecture récursive du fichier
► Afficher le texteLire XML
Code : Tout sélectionner
Local $fName = @ScriptDir & '\Matwawich.xml'
Local $aXML = _XML_ElementsToArry($fName)
Local $xmldoc = ObjCreate( 'Microsoft.XMLDOM' )
If Not IsObj($xmldoc) Then
SetError ( 1 )
Return -1
EndIf
$xmldoc.async = False
If $xmldoc.load($sXMLFilePath) Then
_LoadNodes($xmldoc.childNodes, 0)
Else
MsgBox(0, '', 'tararatata je le charge pas le XML ...')
Return SetError(1)
EndIf
Func _LoadNodes($aNode, $Indent)
Local $xNode
$Indent += 2
For $xNode In $aNode
; If $xNode.nodeType = "NODE_TEXT" Then
ConsoleWrite("Identation " & $Indent & " => " & $xNode.parentNode.nodeName & _
$xNode.nodeName & " " & $xNode.nodetype & " : " & $xNode.nodeValue & @CRLF)
; EndIf
If $xNode.hasChildNodes Then ;recusivité sur les child
_LoadNodes($xNode.childNodes, $Indent)
EndIf
Next
EndFunc
Et ça ne ... marche pas, je n'affiche aucune valeur et pour cause,en regardant de plus prés le lien MSDN la NodeValue ne se trouve pas
au bon endroit dans ton fichier
on dirait. Regarde l'exemple de la page :
http://msdn.microsoft.com/fr-fr/library ... aspx#HowDo
En gros ça devrait le faire avec un fichier de ce type :
<Project name="Mon Projet">
<File path="tralala 1">c:\Config.au3</File>
<File path="tralala 2">c:\Globals.au3</File>
<File path="tralala 3">c:\Db.au3></File>
<Folder name="Dossier">
<File path="Troubadour 1">c:\GUI.au3</File>
<File path="Troubadour 2">c:\Lang.au3</File>
<File path="Troubadour 3">c:\Notif.au3</File>
<File path="Troubadour 4">c:\Server.au3</File>
</Folder>
</Project>
Hum, pas certain d'avoir été très clair sur mes explications

Re: [..] XML <-> TreeView
Posté : jeu. 26 janv. 2012 13:23
par matwachich
Pfiou!
Plus je lis le Guide d'initiation et plus j'ai besoin de Doliprane!
Je crois que je vais abandoné l'idée du XML, c'est beaucoups plus compliqué qu'il n'y paraît!
J'ai vu les liens du forum anglais, et rien de concluant non plus.
Je crois que je vais me tourner vers un bon vieux ini!
Re: [R] XML <-> TreeView
Posté : jeu. 26 janv. 2012 14:45
par mikell
Code : Tout sélectionner
Global $projet
If $projet = $xml Then
For $doliprane_box = 5 to 0 step -1
Do
$doliprane +=1
Sleep(1000)
Until $doliprane = 10
Next
$xml = 0
$projet = $ini
EndIf
Re: [R] XML <-> TreeView
Posté : jeu. 26 janv. 2012 15:28
par ZDS
Bonjour,
Si tu me laisses l'aprèm, j'essaye de te faire un script qui te générera un treeview à partir d'un XML (ne lâche pas l'affaire avec le XML, c'est quand même beaucoup plus puissant et largement plus fin que les structures INI ^^).
A plus tard !
Re: [R] XML <-> TreeView
Posté : jeu. 26 janv. 2012 15:41
par jchd
Oui, c'est bien et très tendance XML & co. Mais franchement lourdingue pour nous.
Au passage, je ne résiste pas à l'envie de vous rappeler ce qu'en dit Roger Binns, pourtant un sacré geek :
"If your question is generally about dealing with XML then I suggest fixing a
large amount of padding on the table in front of you right in the spot where
you will be repeatedly banging your head."
Désolé pour la VO ; traduit c'est moins bien.
Re: [R] XML <-> TreeView
Posté : jeu. 26 janv. 2012 18:14
par ZDS
"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 ^^)
Re: [R] XML <-> TreeView
Posté : jeu. 26 janv. 2012 22:16
par matwachich
Tout simplement génial!!!
Je vais décortiqué tout ça! C'est résolu!
Après, il si j'arrive à faire le chemin inverse: passer d'une structure TreeView vers un fichier XML, le gestionnaire de projet pour Scite sera ma priorité N°1! Et pourquoi pas, il sera peut être
intégré dans la distribution de Scite4AutoIt!
Re: [R] XML <-> TreeView
Posté : ven. 27 janv. 2012 10:37
par jchd
Salut ZDS,
Relis bien ce que j'ai dit : " Oui, c'est bien [...] XML"
Et ce n'est pas moi qui parle de .ini, n'est-ce pas.
Je dis seulement que pour une utilisation générale (donc complexe, sinon JSON fait le boulot) XML n'est pas des plus simples. Je ne m'embarquerai pas sur un CMake reposant sur un XML rigoureux en AutoIt.
Si on veut un vrai gestionnaire de projets, il faut gérer des foultitudes de détails et la chose devient subtile.
Re: [R] XML <-> TreeView
Posté : sam. 28 janv. 2012 21:30
par Tlem
En fouillant le net, je suis tombé sur ceci :
http://www.zmws.com/forum/viewtopic.php?id=3606
Certes, c'est un peut vieux, mais cela peut sans doute être une alternative à l'UDF
_XMLDomWrapper bien que celui-ci ce base sur le même principe. Simplement, là c'est expliqué en Français.

Re: [R] XML <-> TreeView
Posté : sam. 28 janv. 2012 22:41
par matwachich
Merci Tlem!
Ca me rappel qu'il faut activer le mode Asynchrone, et que on peut utiliser le membre
documentElement, j'en déduit donc qu'il ne peut y avoir qu'un seul élément père (root) par fichier.
Et aussi, j'apprend l'existence du membre Lenght, qui me sera utile je pense.
PS: Juste pour vous montrer l'avancement des travaux (et pour frimer un peut!

)
Lancer le script SPM.au3, et faites File -> Open et ouvrez le fichier Scite Project Manager.pnproj, vous verrez l'arboréscence de ce projet s'afficher.
Et aussi, quand on double-clique sur un TreeView Item, ses propriétés s'affichent dans la console.
Prochain défit: Faire le chemin inverse! D'un TreeView vers un XML (faudra décortiquer GuiTreeView.au3 !)
Re: [R] XML <-> TreeView
Posté : sam. 28 janv. 2012 22:47
par silvere
J'ai pas compris ton projet servirais quoi ? un espèce de explorer ?
Re: [R] XML <-> TreeView
Posté : sam. 28 janv. 2012 23:05
par matwachich
Ca sera pour gérer les projets:
Un logiciel (AutoIt ou autre) possède en général plusieurs fichiers (pour moi en tous cas, qui déteste les gros fichiers de 3000 lignes!): un contient le script principal, l'autre les GUIs, un autre les fonctions relatives à tel ou tel aspect du programme.
Sans compter les autre fichiers: Documentation, To Do liste, Change Log, UDF non standards...
Alors, pourquoi pas mettre toutes cette structure dans un seul fichier??? comme le font tous (presque!) les autre IDE des autres langages?
Pour avoir une idée de ce que je veut faire, Téléchargez Programmer's Notepad, et voyez le gestionnaire de projet (à gauche), c'est (presque) exactement la même chose que je veut faire, mais pour Scite!
J'utilise bien en ce moment PN, que j'ai adapter pour AutoIt, ça fonctionne très bien: je compile directement, F1 marche, j'ai recréer Open Include... Mais Scite4AutoIt possède des fonctionnalités irremplaçables!
J'en ai parler dans le Thread de la beta de Scite sur le forum anglais, mais ils m'on dit qu'aucun utilitaire supplémentaire ne sera développé pour Scite.
Alors, en pensant à ça, je me suis dit: et les dev. de Scite, ils ne compte pas faire de gestionnaire de projet???
Alors j'ai poster un Feature Request sur la page SourceForge de Scite! on vera bien!!!
Re: [R] XML <-> TreeView
Posté : sam. 28 janv. 2012 23:12
par silvere
Très bonne idée !
Re: [R] XML <-> TreeView
Posté : dim. 29 janv. 2012 00:06
par Baku
Ouah, excellente idée, c'est vrai que ça manque !
Bon courage pour la suite ! C'est le genre d'outil qui devient indispensable quand on y a goûté !

Re: [R] XML <-> TreeView
Posté : lun. 30 janv. 2012 21:39
par matwachich
Juste pour info, j'ai mis le projet sur
Google Code