Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev > Contribuez
Contribuez Vos contributions pour la rubrique Windev : articles, cours, tutoriels, faq, comparatifs, tests, sources, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/04/2012, 17h33   #1
bastiencb
Membre régulier
 
Inscription : août 2005
Messages : 56
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 56
Points : 70
Points : 70
Par défaut Windev : Parcourir un fichier XML en entier et le charger dans une structure de type arbre en mémoire (DOM)

Voici un code permettant d'effectuer le parcours complet d'un fichier XML et de le charger dans une structure arborescence, un peu à la manière du DOM (http://fr.wikipedia.org/wiki/Document_Object_Model) (En beaucoup plus simple).

Je trouve plus pratique dans certains cas de parcourir ce type d'arbre mémoire, plutôt que d'utiliser les fonctions XML fournies par Windev.

Tout d'abord, dans le code de déclaration de ma fenêtre, je déclare deux structures :

La structure strEl contiendra les noeuds de type "Element", et la structure strAt contiendra les noeuds de type "Attribut".

-Un attribut a un nom et contient une donnée.
-Un élément a un nom, peut contenir une donnée, peut avoir des attributs et peut contenir d'autres éléments.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Structure pour les noeuds de type "Attribut"
strAt est une structure
	sXPath est une chaîne
	sNom est une chaîne
	sDonnee est une chaîne
FIN

//Structure pour les noeuds de type "Element"
strEl est une structure
	sXPath est une chaîne
	sNom est une chaîne
	sDonnee est une chaîne
	tstAt est un tableau de strAt
	tstEl est un tableau de strEl
FIN
Voici le code parcours et de création de l'arborescence mémoire du fichier XML :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LOCAL
	sDocXml est une chaîne
	sXML est une chaîne

sXML = fChargeTexte(SC_SelecteurFichier.SAI_FIC)

sDocXml = "XmlDoc"+DonneGUID(guidBrut)

SI PAS XMLDocument(sDocXml,sXML) ALORS
	Erreur(ErreurInfo(errComplet))
	RENVOYER Faux
FIN

XMLRacine(sDocXml)

//Déclaration de l'élément racine
stEl est un strEl
ParcoursXML(sDocXml,stEl,Vrai)
Et le code de la méthode "ParcoursXML" :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
PROCEDURE ParcoursXML(_sDocXML est une chaîne,_stEl,_bRacine est un booléen=Faux)

iPos est un entier

Trace(XMLPosition(_sDocXML))

stEl est un strEl
stat est un strAt

SELON XMLTypeElement(_sDocXML)
	
	CAS XMLBalise			
				
		SI XMLFilsExiste(_sDocXML) ALORS
			
			iPos = XMLSauvePosition(_sDocXML)
			
			XMLFils(_sDocXML)
			
			XMLPremier(_sDocXML)
			TANTQUE PAS XMLEnDehors(_sDocXML)			
				ParcoursXML(_sDocXML,stEl)			
				XMLSuivant(_sDocXML)
			FIN
			
			XMLRetourPosition(_sDocXML,iPos)
			
			stEl:sNom 	= XMLNomElément(_sDocXML)
			stEl:sDonnee 	= XMLDonnée(_sDocXML)
			stEl:sXPath 	= XMLPosition(_sDocXML)
			SI _bRacine ALORS
				_stEl = stEl
			SINON
				TableauAjoute(_stEl:tstEl,stEl)
			FIN
			
		SINON
			
			stEl:sNom 	= XMLNomElément(_sDocXML)
			stEl:sDonnee 	= XMLDonnée(_sDocXML)
			stEl:sXPath 	= XMLPosition(_sDocXML)
			SI _bRacine ALORS
				_stEl = stEl
			SINON
				TableauAjoute(_stEl:tstEl,stEl)
			FIN
			
			XMLSuivant(_sDocXML)	
			SI XMLTrouve(_sDocXML) ALORS
				ParcoursXML(_sDocXML,_stEl)		
			SINON
				RENVOYER Vrai
			FIN	
		FIN
		
	CAS XMLAttribut
				
		stAt:sNom 	= XMLNomElément(_sDocXML)
		stAt:sDonnee 	= XMLDonnée(_sDocXML)
		stAt:sXPath 	= XMLPosition(_sDocXML)
		TableauAjoute(_stEl:tstat,stAt)
		
		XMLSuivant(_sDocXML)	
		SI XMLTrouve(_sDocXML) ALORS
			ParcoursXML(_sDocXML,_stEl)
		SINON
			RENVOYER Vrai
		FIN	
		
	AUTRE CAS
		RENVOYER Vrai		
FIN

RENVOYER Vrai
Je précise que j'utilise volontairement des structures non dynamiques, malgrès que cela altère la lisibilité du code, car un bug de Windev 15 empêche de visualiser le contenu de structures dynamiques dans le débogueur.

Une fois ma structure récupérée, je peut la parcourir et effectuer des recherches simplement de cette façon :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//Parcours des éléments contenus dans mon élément racine
POUR TOUT stElFils DE stEl:tstEl
	
	Trace("--------------------------------------")
	Trace("Element courant")
	Trace("stElFils:sNom = "+stElFils:sNom)
	Trace("stElFils:sDonnee = "+stElFils:sDonnee)
	Trace("stElFils:sXPath = "+stElFils:sXPath)	
	
	Trace("--------------------------------------")
	Trace("Parcours des attributs de l'élément courant")
	POUR TOUT stAt DE stElFils:tstAt
		
		Trace("stAt:sNom = "+stAt:sNom)
		Trace("stAt:sDonnee = "+stAt:sDonnee)
		Trace("stAt:sXPath = "+stAt:sXPath)	
		
	FIN
	
	Trace("--------------------------------------")
	Trace("Parcours des éléments fils de l'élément courant")
	POUR TOUT stElFils2 DE stElFils:tstEl
		
		Trace("stElFils2:sNom = "+stElFils2:sNom)
		Trace("stElFils2:sDonnee = "+stElFils2:sDonnee)
		Trace("stElFils2:sXPath = "+stElFils2:sXPath)	
		
		//Et ainsi de suite...
		
	FIN
	
	iIndice est un entier
	stElTrouve est un strEl
	
	Trace("--------------------------------------")
	Trace("Recherche d'un élément fils de l'élément courant dont le nom est ""Couleur""")
	iIndice = TableauCherche(stElFils:tstEl,tcLinéaire,"sNom","Couleur")
	SI iIndice <> -1 ALORS

		stElTrouve = stElFils:tstEl[iIndice]
		
		Trace("stElTrouve:sNom = "+stElTrouve:sNom)
		Trace("stElTrouve:sDonnee = "+stElTrouve:sDonnee)
		Trace("stElTrouve:sXPath = "+stElTrouve:sXPath)	
		
	FIN
	
	Trace("--------------------------------------")
	Trace("Recherche d'un élément fils de l'élément courant possédant un attribut ""Couleur"" dont la valeur est ""Bleu""")
	POUR TOUT stElFils2 DE stElFils:tstEl
		
		iIndice = TableauCherche(stElFils2:tstAt,tcLinéaire,"sNom;sDonnee","Couleur","Bleu")
		SI iIndice <> -1 ALORS
			
			stElTrouve = stElFils2
			
			Trace("stElTrouve:sNom = "+stElTrouve:sNom)
			Trace("stElTrouve:sDonnee = "+stElTrouve:sDonnee)
			Trace("stElTrouve:sXPath = "+stElTrouve:sXPath)	
			
			SORTIR
			
		FIN
		
	FIN
	
FIN
Voilà !

Bonne prog
bastiencb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2012, 10h39   #2
bastiencb
Membre régulier
 
Inscription : août 2005
Messages : 56
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 56
Points : 70
Points : 70
Par défaut Windev : Parcourir un fichier XML en entier et le charger dans un champ de type Arbre Windev

Voici un code permettant d'effectuer le parcours complet d'un fichier XML et de le charger dans un champ de type Arbre Windev.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
ArbreSupprimeTout(ARB_XML)

LOCAL
	sDocXml est une chaîne
	sXML est une chaîne
	
sXML = [
<?xml version="1.0" encoding="ISO-8859-1"?>
<racine>
<element id="1">
<infos Couleur="rouge"/>
<Couleur>rouge</Couleur>
</element>
<element id="2">
<infos Couleur="vert"/>
<Couleur>vert</Couleur>
</element>
<element id="3">
<infos Couleur="bleu"/>
<Couleur>bleu</Couleur>
</element>
</racine>
]

//Avant de passer la chaine XML à la fonction XMLDocument(), il faut éventuellement l'encoder au format UFT8 si elle ne contient pas de déclaration d'encodage (<?xml version="1.0" encoding="ISO-8859-1"?>).
//Dans mon cas, ce n'est donc pas nécessaire.
//sXML = ChaîneVersUTF8(sXML)

sDocXml = "XmlDoc"+DonneGUID(guidBrut)

SI PAS XMLDocument(sDocXml,sXML) ALORS
	Erreur(ErreurInfo(errComplet))
	RENVOYER Faux
FIN

XMLRacine(sDocXml)

//Déclaration de l'élément racine
ParcoursXML(sDocXml,ARB_XML..Nom)
Et le code de la fonction "ParcoursXML", un peu modifié par rapport à l'exemple précédent (J'utilise une image "Img_Arobase" pour dissocier les feuilles de l'arbre de type "Element" de celles de type "Attribut") :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
PROCEDURE ParcoursXML(_sDocXML est une chaîne,_sArbreNom est une chaîne)

iPos est un entier
sXMLPosition est une chaîne
sArbreChemin est une chaîne
sXMLDonnee est une chaîne

sXMLPosition = XMLPosition(_sDocXML)
//Enlever le premier SLASH
sArbreChemin = Droite(sXMLPosition,Taille(sXMLPosition)-1)
sArbreChemin = Remplace(sArbreChemin,"/",TAB)

//A utiliser uniquement dans le cas où le XML passé à XMLDocument() ne contient pas de déclaration d'encodage.
//sXMLDonnee = UTF8VersChaîne(XMLDonnée(_sDocXML))
sXMLDonnee = XMLVersTexte(sXMLDonnee)

SELON XMLTypeElement(_sDocXML)

	CAS XMLBalise			
		
		ArbreAjoute(_sArbreNom,sArbreChemin,aDéfaut,aDéfaut,sXMLPosition)
		
		SI SansEspace(sXMLDonnee) <> "" ALORS
			ArbreAjoute(_sArbreNom,sArbreChemin+TAB+sXMLDonnee,"","",sXMLPosition)
		FIN
		
		SI XMLFilsExiste(_sDocXML) ALORS
			
			iPos = XMLSauvePosition(_sDocXML)
			
			XMLFils(_sDocXML)
			
			XMLPremier(_sDocXML)
			TANTQUE PAS XMLEnDehors(_sDocXML)			
				ParcoursXML(_sDocXML,_sArbreNom)			
				XMLSuivant(_sDocXML)
			FIN
			
			XMLRetourPosition(_sDocXML,iPos)
			
		SINON
			
			XMLSuivant(_sDocXML)	
			SI XMLTrouve(_sDocXML) ALORS
				ParcoursXML(_sDocXML,_sArbreNom)		
			SINON
				RENVOYER Vrai
			FIN	
		FIN
		
	CAS XMLAttribut
		
		ArbreAjoute(_sArbreNom,sArbreChemin,Img_Arobase,Img_Arobase,sXMLPosition)
		
		SI SansEspace(sXMLDonnee) <> "" ALORS
			ArbreAjoute(_sArbreNom,sArbreChemin+TAB+sXMLDonnee,"","",sXMLPosition)
		FIN
				
		XMLSuivant(_sDocXML)	
		SI XMLTrouve(_sDocXML) ALORS
			ParcoursXML(_sDocXML,_sArbreNom)
		SINON
			RENVOYER Vrai
		FIN	
		
	AUTRE CAS
		RENVOYER Vrai		
FIN

RENVOYER Vrai
Voilà !

Bonne prog
bastiencb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h57.


 
 
 
 
Partenaires

Hébergement Web