IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Traitement d'un fichier XML


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Traitement d'un fichier XML
    Bonjour,

    Je souhaite faire une petite appli qui permet, après importation d'un document CERFA reçu au format XML, de reprendre une partie des informations contenues dans ce fichier XML afin de créer un nouveau document CERFA (etat avec PDF en fond de page) complété des informations extraites.

    J'ai créé une fenêtre qui permet d'aller rechercher le fichier XML, que je stocke dans une variable "Flux_XML" de type xmldocument, grâce à la commande XMLouvre.
    J'ai importé dans le projet la description XSD sur lequel mon fichier XML s'appuie, ce qui me permet de tester la validé du fichier XML reçu (XmlDocumentValide).
    J'ai également importé une description XML ( un de mes fichiers de test) afin d'avoir une lecture plus rapide des balises composant mon fichier XML.

    Concrètement, je n'ai pas trouvé la syntaxe correcte pour récupérer le contenu d'une balise, en recherchant celle-ci dans le fichier

    Par exemple récupérer la date de la déclaration (dossierconsultation.dtdictconjointes.datedeladeclaration)

    Merci de votre aide

    Je joins un fichier XML d'exemple pour aider à la compréhension ( changer l'extension en .xml car ce format est rejeté comme format de fichier joint)
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Plus je parcours l'aide pcsoft et plus je me noie dans les informations données. Soit il yen a trop soit elles sont peu explicites et je ne m'y retrouve pas.

    Ca peut aussi être moi qui comprends rien enfin bref je cherche surtout un cas d'exemple type me permettant d'utiliser la bonne syntaxe wlangage.

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    hello,
    voici comment il faut faire par exemple. Je suis parti de ton fichier essai.txt que j'ai renommé essai.xml :

    1 - Dans son projet, dans l'explorateur de projet cliquer sur Description XML et cliquer droit et choisir importer un fichier de description xml en choississant le fichier essai.xml.
    3 - Maintenant on peut voir la structure du xml.
    Et voici un exemple de code qui permet de récupérer certaines informations du fichier xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MonEssai  est un WL.XMLDocument,description="essai"
    MonEssai = XMLOuvre("F:\temp\essai.xml",depuisFichier)
    SI ErreurDétectée = Vrai ALORS
    	Erreur(ErreurInfo())
    SINON 
    	Trace("Date déclaration  : ",MonEssai.dossierConsultation.dtDictConjointes.dateDeLaDeclaration)
    	POUR TOUT ouvrage DE MonEssai.dossierConsultation.listeDesOuvrages
    		Trace("=================Ouvrage====================")
    		Trace("Société : ",ouvrage.contact.societe," - Commune : ",ouvrage.contact.commune)
    		Trace("Nom : ",ouvrage.contact.nom.NomFamille,"  - Prénom : ",ouvrage.contact.prenom.Prenom)			
    	FIN
    FIN
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci de m'aider !

    Voilà ce que j'avais pondu comme code de mon côté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Flux_XML = XMLOuvre(SAI_FIC,depuisFichier)
    SI ErreurDétectée = Vrai ALORS
    	Erreur("Impossible d'ouvrir le document.")
    FIN
    SI XMLDocumentValide(Flux_XML, "schemaTeleservice_2_1") = Faux ALORS
    	Erreur(ErreurInfo())
    SINON
    	Info("Le document XML est valide")
    	BTN_Impress..Etat=Actif
     
    	// recherche nature du document parmi 3 modèles possibles (DT,DICT,DT/DICT)
    	// Les infos à récupérer ne sont pas les mêmes suivant la nature du document reçu
    	XMLRacine(Flux_XML)
    	XMLRecherche("Flux_XML","DT",XMLBalise)
    	SI XMLTrouve("Flux_XML") ALORS
    		SEL_Nature=1
    		Info(Flux_XML.dossierConsultation.DT.dateDeLaDeclaration)
    	SINON
    		XMLRecherche("Flux_XML","DICT",XMLBalise)
    		SI XMLTrouve("Flux_XML") ALORS
    			SEL_Nature=2
    			Info(Flux_XML.dossierConsultation.DICT.dateDeLaDeclaration)
    		SINON
    			XMLRecherche("Flux_XML","DtDictConjointes",XMLBalise)
    			SI XMLTrouve("Flux_XML") ALORS
    				SEL_Nature=3
    				Info(Flux_XML.dossierConsultation.dtDictConjointes.dateDeLaDeclaration)
    			FIN
    		FIN
    	FIN
    FIN
    et le message d'erreur que je reçois en retour, une fois le test de validité du document passé (avec succès) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Vous avez appelé la fonction XMLRacine.
    Le passage du paramètre 1 a provoqué une erreur.
    Un élément de type 'xmlDocument' ne peut pas être converti vers le type 'chaîne UNICODE'.
    J'ai pourtant suivi les exemples indiqués, mais dans mon cas, avant d'aller piocher certaines données pour constituer mon document CERFA de retour, je dois m'assurer de l'existence de certaines balises au préalable. Et c'est là que je bloque...
    Pour faire simple, je peux avoir à traiter 3 types de fichiers XML distincs, chacun d'eux étant conforme à un modèle .XSD (schemaTeleservice_2_1). Je suis donc dans l'obligation de tester ( si je ne veux pas laisser ce choix à l'utilisateur qui peut, parfois, faire des erreurs d'inattention) l'existence de certaines balises.

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    Bonjour,

    La syntaxe de XMLRacine(..) prend une chaîne de caractère et non un xmlDocument, et tu n'as pas utilisé la fonction XMLDocument(..) au préalable.

    A mon avis, soit tu utilises XMLDocument(..) et XMLRacine(..) avec les fonctions de recherche XML, soit XMLOuvre(..) en manipulant des variables de type xmlDocument et xmlNoeud.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci de votre aide !


    Effectivement je viens de voir qu'il y a 2 approches différentes et que le "mix" des 2 ne donne pas forcément des résultats cohérents.
    Je suis parti sur les commandes du type XMLRacine,XMLRecherche pour cibler une balise, ça fonctionne bien.

    Ensuite ce que je n'arrive pas à faire, une fois positionné sur le noeud recherché, c'est de parcourir et récupérer l'ensemble des données qui découlent de ce noeud.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    doc_xml = fChargeTexte(SAI_FIC)
    flag_noeud est un booléen=Faux
     
    SI XMLDocument("f_xml",doc_xml)=Faux ALORS
    	Erreur("Impossible de charger le document XML",ErreurInfo())
    	RETOUR
    FIN
     
    XMLRacine("f_xml")
    XMLRecherche("f_xml",Null,XMLElément+XMLSousElément,XMLCommencePar)
    TANTQUE XMLTrouve("f_xml") ET PAS flag_noeud
    	//Test le type d'éléments trouvé
    	SI XMLTypeElement("f_xml")=XMLBalise ET XMLNomElément("f_xml")="DT" ALORS
    		SEL_Nature=1
    		flag_noeud=Vrai
    		extraction_donnees_DT()
    	FIN
    	SI XMLTypeElement("f_xml")=XMLBalise ET XMLNomElément("f_xml")="DICT" ALORS
    		SEL_Nature=2
    		flag_noeud=Vrai
    		extraction_donnees_DICT()
    	FIN
    	SI XMLTypeElement("f_xml")=XMLBalise ET XMLNomElément("f_xml")="dtDictConjointes" ALORS
    		SEL_Nature=3
    		flag_noeud=Vrai
    		extraction_donnees_Conjointes()
    	FIN
    	XMLSuivant("f_xml")
    FIN
    XMLAnnuleRecherche("f_xml")
    Dans mes procédures extraction, j'ai essayé d'utiliser XMLSuivant pour parcourir le fichier de façon linéaire mais je reste bloqué sur la balise recherchée.

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    hello,
    ma méthode exposée plus haut ne fonctionne pas ? C'est quand même plus facile. Rien n'empêche le test de validation avant l'utilisation.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    C'est en effet la méthode préconisée dans l'aide, cad l'utilisation des variables de type xmlDocument et xmlNoeud.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Il est possible que la méthode avec XMLOuvre soit la plus simple mais je n'ai pas réussi foire ce que je voulais avec.
    Je vais dans un premier temps valider la réalisation de ce projet et je reviendrais sur la méthode ensuite.

    Ci-dessous mon avancée avec la méthode XMLRecherche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Flux_XML est un xmlDocument <description="schemaTeleservice_2_1">
    doc_xml est une chaîne
     
     
    Flux_XML = XMLOuvre(SAI_FIC,depuisFichier)
    SI ErreurDétectée = Vrai ALORS
    	Erreur("Impossible d'ouvrir le document.")
    FIN
    SI XMLDocumentValide(Flux_XML, "schemaTeleservice_2_1") = Faux ALORS
    	Erreur(ErreurInfo())
    FIN
    Info("Le document XML est valide")
     
     
    doc_xml = fChargeTexte(SAI_FIC)
    flag_noeud est un booléen=Faux
     
    SI XMLDocument("f_xml",doc_xml)=Faux ALORS
    	Erreur("Impossible de charger le document XML",ErreurInfo())
    	RETOUR
    FIN
     
    XMLRacine("f_xml")
    // Les infos à récupérer ne sont pas les mêmes suivant la nature du document reçu
    XMLRecherche("f_xml",Null,XMLElément+XMLSousElément,XMLCommencePar)
    TANTQUE XMLTrouve("f_xml") ET PAS flag_noeud
    	//Test le type d'éléments trouvé
    	SI XMLTypeElement("f_xml")=XMLBalise ET XMLNomElément("f_xml")="DT" ALORS
    		SEL_Nature=1
    		flag_noeud=Vrai
    		recuperation_donnees_DT()
    	FIN
    	SI XMLTypeElement("f_xml")=XMLBalise ET XMLNomElément("f_xml")="DICT" ALORS
    		SEL_Nature=2
    		flag_noeud=Vrai
    		recuperation_donnees_DICT()
    	FIN
    	SI XMLTypeElement("f_xml")=XMLBalise ET XMLNomElément("f_xml")="dtDictConjointes" ALORS
    		SEL_Nature=3
    		flag_noeud=Vrai
    		recuperation_donnees_Conjointes()
    	FIN
    	XMLSuivant("f_xml")
    FIN
    XMLAnnuleRecherche("f_xml")
    Procédure Recuperation_Donnees_Conjointes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    PROCEDURE recuperation_donnees_Conjointes()
    XMLFils("f_xml")
    SI XMLNomElément("f_xml")="noConsultationDuTeleservice" ALORS 
    	stDonnees_XML.sNum_consult=XMLDonnée("f_xml")
    	Info("n°consultation : "+stDonnees_XML.sNum_consult)
    FIN
    XMLSuivant("f_xml")
    SI XMLNomElément("f_xml")="dateDeLaDeclaration" ALORS 
    	stDonnees_XML.dDatedelaDeclaration=XMLDonnée("f_xml")
    	Info("Date de déclaration : "+stDonnees_XML.dDatedelaDeclaration)
    FIN
    XMLSuivant("f_xml")
    // Positionnement sur la balise partieDICT
    SI XMLNomElément("f_xml")="partieDT" ALORS 
    	XMLSuivant("f_xml")
    	SI XMLNomElément("f_xml")="partieDICT" ALORS 
    		XMLFils("f_xml")		
    	SINON
    		Erreur("Incohérence Balise XML : partieDICT")
    	FIN
    SINON
    	Erreur("Incohérence Balise XML : partieDT")
    FIN
    // Traitement du bloc Partie DICT
    XMLPremier("f_xml")
    TANTQUE XMLEnDehors("f_xml") = Faux
    	SELON XMLNomElément("f_xml")
    		CAS "noConsultationDuTeleservice" : stDonnees_XML.sNum_consult=XMLDonnée("f_xml")
    		CAS "noAffaireDeLexecutantDesTravaux" : stDonnees_XML.sNum_consult=XMLDonnée("f_xml")
    		CAS "dateDeLaDeclaration" : stDonnees_XML.sNum_consult=XMLDonnée("f_xml")
    		CAS "natureDeLaDeclaration" : stDonnees_XML.sNum_consult=XMLDonnée("f_xml")
    		CAS "executantDesTravaux" : 
    			// Traitement du bloc Exécutant des travaux
    			XMLFils("f_xml")
    			XMLPremier("f_xml")
    			TANTQUE XMLEnDehors("f_xml") = Faux
    				SELON XMLNomElément("f_xml")
    					CAS "denomination" : stDonnees_XML.sDenomination=XMLDonnée("f_xml")
    					CAS "complementService" : stDonnees_XML.sComplementService=XMLDonnée("f_xml")
    					CAS "numero" : stDonnees_XML.sNumero=XMLDonnée("f_xml")
    					CAS "voie" : stDonnees_XML.sVoie=XMLDonnée("f_xml")
    					CAS "lieuDitBP" : stDonnees_XML.sLieuditBp=XMLDonnée("f_xml")
    					CAS "codePostal" : stDonnees_XML.nCodePostal=XMLDonnée("f_xml")
    					CAS "commune" : stDonnees_XML.sCommune=XMLDonnée("f_xml")
    					CAS "pays" : stDonnees_XML.sPays=XMLDonnée("f_xml")
    					CAS "noSiret" : stDonnees_XML.sNoSiret=XMLDonnée("f_xml")
    					CAS "nomDeLaPersonneAContacter" : stDonnees_XML.sPersonneAContacter=XMLDonnée("f_xml")
    					CAS "tel" : stDonnees_XML.nTel=XMLDonnée("f_xml")
    					CAS "fax" : stDonnees_XML.nFax=XMLDonnée("f_xml")
    					CAS "courriel" : stDonnees_XML.sCourriel=XMLDonnée("f_xml")
    					AUTRE CAS 
    						//on ne récupère rien d'autre
    						XMLParent("f_xml")
    				FIN
    				XMLSuivant("f_xml")
    			FIN
    		AUTRES CAS
    			//on ne récupère rien d'autre
    			XMLParent("f_xml")	
    	FIN
    	XMLSuivant("f_xml")
    FIN
    XMLParent("f_xml")
    La particularité de mon traitement repose sur l'ensemble de ces points :

    1) Pouvoir tester l'existence d'un Noeud
    2) Extraire des données à l'intérieur d'un Noeud par un parcours à l'intérieur de ce noeud
    3) Pour un noeud donné, en se référant au modèle, un document XML peut ne fournir qu'une partie des éléments possibles.Par exemple un fichier XML1 peut contenir dans le noeud DICT une balise NoSiret avec une valeur, et un second fichier XML2 peut contenir également un noeud DICT mais sans balise NoSiret présente. D'où l'utilisation dans mon code de "SELON CAS".

    Merci en tout cas pour vos retours

Discussions similaires

  1. [WINDEV all] Traitement d'un fichier XML
    Par nemosfib dans le forum WinDev
    Réponses: 2
    Dernier message: 05/03/2008, 16h06
  2. Traitement de plusieurs fichiers XML
    Par Katachana dans le forum Langage
    Réponses: 1
    Dernier message: 22/05/2007, 16h54
  3. Traitement d'un fichier XML distant
    Par slytech dans le forum ASP
    Réponses: 5
    Dernier message: 17/11/2006, 11h09
  4. Java et XML : Traitement d'un fichier XML avec JAVA
    Par nice dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 18/05/2006, 21h24
  5. [C#] [XML] Traitement de gros fichiers XML (90 Mo)
    Par Pulsahr dans le forum Windows Forms
    Réponses: 20
    Dernier message: 01/12/2005, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo