Comparer 2 fichiers XML

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Comparer 2 fichiers XML

Message par Le Soldat Inconnu »

Salut tout le monde,

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
Pour les curieux, je fais toujours du PureBasic mais au travail, sisi, je programme des logiciels pour une toute petite entreprise française qui fait du pneumatique, ça s'appelle M......N.
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 !

++
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comparer 2 fichiers XML

Message par Ar-S »

Salut LSI
Petit soucis d'espace pour tes noms de balises avec les deux points.

Code : Tout sélectionner

Balise_png : => Balise_png: 
Attribut_png : => Attribut_png:
2 questions hs tant que t'es là.
- Pourrais tu m'envoyer le code de ton vers de terre
- Pourrais tu regarder le topic de ta skinlib car j'avais un message d'erreur que j'avais notifié.

Et dépêches toi pour tes travaux, l'hiver approche :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comparer 2 fichiers XML

Message par falsam »

Bonjour LSI. Ca faisant longtemps qu'on ne t'avait pas lu. :) Réponse en image et merci pour le partage.

@Ar-s : Laisse lui le temps de découvrir que la version de Pure Basic a évolué :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre