Un petit code en passant qui permet de comparer 2 fichiers XML
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 5.0
; Explication du programme :
; Ouverture et comparaison fichier XML
UsePNGImageDecoder()
#Couleur_Difference = $822CD1
#Couleur_Inexistant = $001CDB
#Couleur_Attribut = $646464
Global Dim Fichier_XML.s(6)
Enumeration
#Menu
#Menu_XML1
#Menu_XML1_Ouvrir
#Menu_XML1_Enregistrer
#Menu_XML1_EnregistrerSous
#Menu_XML1_Fermer
#Menu_XML2
#Menu_XML2_Ouvrir
#Menu_XML2_Enregistrer
#Menu_XML2_EnregistrerSous
#Menu_XML2_Fermer
#PopupMenu_XML1
#PopupMenu_XML1_Copier
#PopupMenu_XML1_Copier_Nom
#PopupMenu_XML1_Copier_Attibut
#PopupMenu_XML1_Copier_Valeur
#PopupMenu_XML1_Copier_Texte
#PopupMenu_XML1_Coller
#PopupMenu_XML1_Editer_Valeur
#PopupMenu_XML1_Editer_Attribut
#PopupMenu_XML1_Editer_Noeud
#PopupMenu_XML1_Editer_Texte
#PopupMenu_XML1_Supprimer_Noeud
#PopupMenu_XML1_Supprimer_Attribut
#PopupMenu_XML1_Ajouter_Noeud
#PopupMenu_XML1_Ajouter_Attribut
EndEnumeration
Enumeration 1
#XML1
#XML1_Titre
#XML1_Fichier
#XML2
#XML2_Titre
#XML2_Fichier
EndEnumeration
Enumeration
#Icone_Attribut
#Icone_Balise
EndEnumeration
Procedure Fenetre_Redimensionner()
If IsXML(#XML1)
HideGadget(#XML1, 0)
HideGadget(#XML1_Titre, 0)
HideGadget(#XML1_Fichier, 0)
If IsXML(#XML2)
HideGadget(#XML2, 0)
HideGadget(#XML2_Titre, 0)
HideGadget(#XML2_Fichier, 0)
ResizeGadget(#XML1_Titre, 0, 0, 48, #PB_Ignore)
ResizeGadget(#XML1_Fichier, 48, 0, WindowWidth(0) / 2 - 48, #PB_Ignore)
ResizeGadget(#XML1, 0, 24, WindowWidth(0) / 2, WindowHeight(0) - MenuHeight() - 24)
ResizeGadget(#XML2_Titre, WindowWidth(0) / 2, 0, 48, #PB_Ignore)
ResizeGadget(#XML2_Fichier, WindowWidth(0) / 2 + 48, 0, WindowWidth(0) / 2 - 48, #PB_Ignore)
ResizeGadget(#XML2, WindowWidth(0) / 2, 24, WindowWidth(0) - WindowWidth(0) / 2, WindowHeight(0) - MenuHeight() - 24)
Else
HideGadget(#XML2, 1)
HideGadget(#XML2_Titre, 1)
HideGadget(#XML2_Fichier, 1)
ResizeGadget(#XML1_Titre, 0, 0, 48, #PB_Ignore)
ResizeGadget(#XML1_Fichier, 48, 0, WindowWidth(0) - 48, #PB_Ignore)
ResizeGadget(#XML1, 0, 24, WindowWidth(0), WindowHeight(0) - MenuHeight() - 24)
EndIf
Else
HideGadget(#XML1, 1)
HideGadget(#XML1_Titre, 1)
HideGadget(#XML1_Fichier, 1)
If IsXML(#XML2)
HideGadget(#XML2, 0)
HideGadget(#XML2_Titre, 0)
HideGadget(#XML2_Fichier, 0)
ResizeGadget(#XML2_Titre, 0, 0, 48, #PB_Ignore)
ResizeGadget(#XML2_Fichier, 48, 0, WindowWidth(0) - 48, #PB_Ignore)
ResizeGadget(#XML2, 0, 24, WindowWidth(0), WindowHeight(0) - MenuHeight() - 24)
Else
HideGadget(#XML2, 1)
HideGadget(#XML2_Titre, 1)
HideGadget(#XML2_Fichier, 1)
EndIf
EndIf
EndProcedure
Procedure AjouteElement(XML, Position, Texte.s, Icone, Couleur, Niveau, *Noeud)
AddGadgetItem(XML, Position, Texte, Icone, Niveau)
If *Noeud
SetGadgetItemData(XML, Position, *Noeud)
EndIf
If Couleur <> -1
SetGadgetItemColor(XML, Position, #PB_Gadget_FrontColor, Couleur)
EndIf
; If Position > 0 And GetGadgetItemAttribute(XML, Position - 1, #PB_Tree_SubLevel) < Niveau
; SetGadgetItemState(XML, Position - 1, #PB_Tree_Expanded)
; EndIf
ProcedureReturn Position + 1
EndProcedure
Procedure AnalyseXML(*Noeud, Niveau, XML, XML_Compare)
Position = CountGadgetItems(XML)
Select XMLNodeType(*Noeud)
Case #PB_XML_Normal
Couleur = -1
If XML_Compare
*Noeud_Compare = XMLNodeFromPath(MainXMLNode(XML_Compare), XMLNodePath(*Noeud))
If *Noeud_Compare = 0
Couleur = #Couleur_Inexistant
EndIf
EndIf
Position = AjouteElement(XML, Position, GetXMLNodeName(*Noeud), ImageID(#Icone_Balise), Couleur, Niveau, *Noeud)
If ExamineXMLAttributes(*Noeud)
While NextXMLAttribute(*Noeud)
If XML_Compare
If *Noeud_Compare
Couleur = #Couleur_Attribut
If GetXMLAttribute(*Noeud_Compare, XMLAttributeName(*Noeud)) = ""
Couleur = #Couleur_Inexistant
ElseIf XMLAttributeValue(*Noeud) <> GetXMLAttribute(*Noeud_Compare, XMLAttributeName(*Noeud))
Couleur = #Couleur_Difference
EndIf
EndIf
Else
Couleur = #Couleur_Attribut
EndIf
Position = AjouteElement(XML, Position, XMLAttributeName(*Noeud) + "=" + Chr(34) + XMLAttributeValue(*Noeud) + Chr(34), ImageID(#Icone_Attribut), Couleur, Niveau + 1, 0)
Wend
EndIf
Case #PB_XML_CData
Couleur = -1
If XML_Compare
*Noeud_Compare = XMLNodeFromPath(MainXMLNode(XML_Compare), XMLNodePath(*Noeud))
If *Noeud_Compare = 0
Couleur = #Couleur_Inexistant
Else
If GetXMLNodeText(*Noeud) <> GetXMLNodeText(*Noeud_Compare)
Couleur = #Couleur_Difference
EndIf
EndIf
EndIf
Position = AjouteElement(XML, Position, "![CDATA[" + GetXMLNodeText(*Noeud) + "]]", ImageID(#Icone_Balise), Couleur, Niveau, *Noeud)
Default
Position = AjouteElement(XML, Position, "?", ImageID(#Icone_Balise), -1, Niveau, *Noeud)
EndSelect
While WindowEvent() : Wend
*Noeud_Enfant = ChildXMLNode(*Noeud)
While *Noeud_Enfant
AnalyseXML(*Noeud_Enfant, Niveau + 1, XML, XML_Compare)
*Noeud_Enfant = NextXMLNode(*Noeud_Enfant)
Wend
EndProcedure
Procedure Deplier(XML)
ii = CountGadgetItems(XML) - 2
For i = 0 To ii
SetGadgetItemState(XML, i, #PB_Tree_Expanded)
Next
EndProcedure
Procedure Afficher()
; temps = ElapsedMilliseconds()
HideGadget(#XML1, 1)
HideGadget(#XML1, 2)
ClearGadgetItems(#XML1)
ClearGadgetItems(#XML2)
While WindowEvent() : Wend
If IsXML(#XML1) And IsXML(#XML2)
AnalyseXML(MainXMLNode(#XML1), 0, #XML1, #XML2)
AnalyseXML(MainXMLNode(#XML2), 0, #XML2, #XML1)
ElseIf IsXML(#XML1)
AnalyseXML(MainXMLNode(#XML1), 0, #XML1, 0)
ElseIf IsXML(#XML2)
AnalyseXML(MainXMLNode(#XML2), 0, #XML2, 0)
EndIf
While WindowEvent() : Wend
If IsXML(#XML1) And IsXML(#XML2)
Deplier(#XML1)
Deplier(#XML2)
ElseIf IsXML(#XML1)
Deplier(#XML1)
ElseIf IsXML(#XML2)
Deplier(#XML2)
EndIf
While WindowEvent() : Wend
SetGadgetState(#XML1, 0)
SetGadgetState(#XML2, 0)
Fenetre_Redimensionner()
; MessageRequester("temps", Str(ElapsedMilliseconds() - temps))
EndProcedure
Procedure Fermer(XML)
FreeXML(XML)
Fichier_XML(XML) = ""
Afficher()
EndProcedure
Procedure Ouvrir(XML, Fichier.s = "")
If Fichier = "" Or FileSize(Fichier) = -1
Fichier.s = OpenFileRequester("XML", Fichier, "Fichier XML|*.XML;*.l5x|Tous les fichiers|*.*", 0)
EndIf
If Fichier And FileSize(Fichier) >= 0
If IsXML(XML)
Fermer(XML)
EndIf
If LoadXML(XML, Fichier)
If XMLStatus(XML) = #PB_XML_Success
SetGadgetText(XML + #XML1_Fichier - #XML1, GetFilePart(Fichier))
Fichier_XML(XML) = Fichier
Afficher()
Else
Fermer(XML)
MessageRequester("XML", "Le fichier n'est pas un document XML")
EndIf
Else
MessageRequester("XML", "Le fichier ne peut pas être ouvert")
EndIf
EndIf
EndProcedure
Procedure Enregistrer(XML)
If IsXML(XML)
SaveXML(XML, Fichier_XML(XML))
EndIf
EndProcedure
Procedure EnregistrerSous(XML)
If IsXML(XML)
Fichier.s = SaveFileRequester("XML", Fichier_XML(XML), "Fichier XML|*." + GetExtensionPart(Fichier_XML(XML)), 0)
If Fichier
If GetExtensionPart(Fichier) = ""
Fichier + "." + GetExtensionPart(Fichier_XML(XML))
EndIf
If CheckFilename(GetFilePart(Fichier))
If FileSize(Fichier) = -1 Or MessageRequester("XML", "Ecraser le fichier existant ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
SetGadgetText(XML + #XML1_Fichier - #XML1, GetFilePart(Fichier))
Fichier_XML(XML) = Fichier
Enregistrer(XML)
EndIf
Else
MessageRequester("XML", "Le nom du fichier est incorrect")
EndIf
EndIf
EndIf
EndProcedure
; Création de la fenêtre
If OpenWindow(0, 0, 0, 800, 600, "XML", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
End
EndIf
CatchImage(#Icone_Balise, ?Balise_png)
CatchImage(#Icone_Attribut, ?Attribut_png)
If CreateMenu(#Menu, WindowID(0))
MenuTitle("Fichier")
MenuItem(#Menu_XML1, "Fichier XML 1")
DisableMenuItem(#Menu, #Menu_XML1, 1)
MenuItem(#Menu_XML1_Ouvrir, "Ouvrir" + Chr(9) + "Ctrl+O")
AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_O, #Menu_XML1_Ouvrir)
;MenuBar()
MenuItem(#Menu_XML1_Enregistrer, "Enregistrer" + Chr(9) + "Ctrl+S")
AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_S, #Menu_XML1_Enregistrer)
MenuItem(#Menu_XML1_EnregistrerSous, "Enregistrer sous ...")
;MenuBar()
MenuItem(#Menu_XML1_Fermer, "Fermer")
MenuBar()
MenuItem(#Menu_XML2, "Fichier XML 2 (pour comparaison)")
DisableMenuItem(#Menu, #Menu_XML2, 1)
MenuItem(#Menu_XML2_Ouvrir, "Ouvrir" + Chr(9) + "Ctrl+Atl+O")
AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_Alt | #PB_Shortcut_O, #Menu_XML2_Ouvrir)
;MenuBar()
MenuItem(#Menu_XML2_Enregistrer, "Enregistrer" + Chr(9) + "Ctrl+Alt+S")
AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_Alt | #PB_Shortcut_S, #Menu_XML2_Enregistrer)
MenuItem(#Menu_XML2_EnregistrerSous, "Enregistrer sous ...")
;MenuBar()
MenuItem(#Menu_XML2_Fermer, "Fermer")
EndIf
TextGadget(#XML1_Titre, 0, 0, 24, 24, "XML 1", #PB_Text_Center | #SS_CENTERIMAGE)
StringGadget(#XML1_Fichier, 0, 0, 24, 24, "", #PB_String_ReadOnly)
TreeGadget(#XML1, 0, 0, 100, 100, #PB_Tree_AlwaysShowSelection)
TextGadget(#XML2_Titre, 0, 0, 24, 24, "XML 2", #PB_Text_Center | #SS_CENTERIMAGE)
StringGadget(#XML2_Fichier, 0, 0, 24, 24, "", #PB_String_ReadOnly)
TreeGadget(#XML2, 0, 0, 100, 100, #PB_Tree_AlwaysShowSelection)
Fenetre_Redimensionner()
; Paramètre de lancement
Fichier.s = ProgramParameter()
If Fichier
Ouvrir(#XML1, Fichier)
EndIf
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_SizeWindow
Fenetre_Redimensionner()
Case #PB_Event_Menu
Select EventMenu() ; Menus
Case #Menu_XML1_Ouvrir
Ouvrir(#XML1)
Case #Menu_XML1_Enregistrer
Enregistrer(#XML1)
Case #Menu_XML1_EnregistrerSous
EnregistrerSous(#XML1)
Case #Menu_XML1_Fermer
Fermer(#XML1)
Case #Menu_XML2_Ouvrir
Ouvrir(#XML2)
Case #Menu_XML2_Enregistrer
Enregistrer(#XML2)
Case #Menu_XML2_EnregistrerSous
EnregistrerSous(#XML2)
Case #Menu_XML2_Fermer
Fermer(#XML2)
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
DataSection
Balise_png :
Data.l $474E5089, $0A1A0A0D, $0D000000, $52444849, $10000000, $10000000, $00000608, $FFF31F00, $00000061, $474B6206, $00FF0044, $A0FF00FF
Data.l $0093A7BD, $49B10000, $38544144, $3B92CD8D, $1030C20E, $0F429F44, $E7CA4141, $068087FE, $2011021A, $49C80685, $0A1148A0, $90B168C6
Data.l $95310A9D, $EC6FBB35, $A8FF0DB5, $A581A80C, $56C056F1, $02DC28B5, $FE347003, $0A1B5E49, $819B8129, $E54B5353, $7C29EA0D, $D1C008B8
Data.l $D3B03190, $0EF38CDC, $00B8C9D9, $CA760079, $3A98AB81, $1E151201, $A0223F40, $4F5AEE07, $63406600, $6006558E, $607BD17B, $487E0AEA
Data.l $80AE05F5, $988D3D4E, $CE90D90F, $4EC2890B, $E3567019, $F9EEF8C1, $69C91F82, $C6D65DA1, $399AF0DB, $4F5EFF0A, $B33B6112, $3A4803C1
Data.l $00000000, $444E4549, $826042AE
Attribut_png :
Data.l $474E5089, $0A1A0A0D, $0D000000, $52444849, $10000000, $10000000, $00000608, $FFF31F00, $00000061, $474B6206, $00FF0044, $A0FF00FF
Data.l $0093A7BD, $492A0000, $38544144, $1860638D, $033F6036, $127FC303, $06065EF1, $A8260606, $58642C01, $1A1E8E4A, $1830D182, $008A030D
Data.l $28B50700, $B381B36F, $00000000, $4E454900, $6042AE44
Data.b $82
EndDataSection
On fait un pendu ? Qui qui trouve ?
Bref, quand on en fait toute la journée, on n'a pas trop envie d'en faire le soir. D'autant que je toujours bien occupé avec mes bricolage et travaux pour ma maison.
Mais je pense à vous les gars, soyez sage !
++