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 :

Récupérer les valeurs d'un fichier XML [WD20]


Sujet :

WinDev

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut Récupérer les valeurs d'un fichier XML
    Bonjour,

    J'ai un fichier XML que je cherche à parser pour en récupérer les informations sous forme de tableau.

    Voici un exemple de fichier :

    Code xml : 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
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <deck game="30c200c9-6c98-49a4-a293-106c06295c05" sleeveid="0">
      <section name="Faction" shared="False">
        <card qty="1" id="a8c94f92-2b17-4a78-bf0f-4411838b9826">House Baratheon</card>
      </section>
      <section name="Agenda" shared="False">
        <card qty="1" id="b3fd4493-5ee7-4e46-9b3b-4ea3d767198b">Banner of the Rose</card>
      </section>
      <section name="Plots" shared="False">
        <card qty="1" id="de88edda-f5a4-4985-8ac1-2b8205c13416">A Clash of Kings</card>
        <card qty="1" id="0fb3ad4b-5cf3-49e9-a33f-484ecafeabf8">A Noble Cause</card>
        <card qty="1" id="446ac0b9-746f-4aa3-b8bf-f132d2b29499">Confiscation</card>
        <card qty="2" id="424194c0-ad9c-473b-b254-40b1274152ba">Heads on Spikes</card>
        <card qty="1" id="a9f2fccd-11f3-4562-aa5a-76d606712311">Marched to the Wall</card>
        <card qty="1" id="d10a1ced-df94-419b-af8e-4eadc2eb4688">Wildfire Assault</card>
      </section>
      <section name="Characters" shared="False">
        <card qty="1" id="499ed82d-cc0e-43a5-89ba-a748b388f528">Littlefinger</card>
        <card qty="1" id="be9304f2-bb5d-4d19-8fbe-4efb6ee24f29">Rattleshirt's Raiders</card>
        <card qty="1" id="0c97b091-96c0-46df-8442-e904025304fb">Maester Cressen</card>
        <card qty="3" id="6ab37ed8-df99-410d-a9ff-7afe98f7ee22">Melisandre</card>
        <card qty="3" id="78ca6089-6d16-4e41-8df7-40042e3dc077">Robert Baratheon</card>
        <card qty="1" id="88de8a8f-4d15-415c-96c8-38edc8f8fe99">Selyse Baratheon</card>
        <card qty="1" id="813fb666-b32f-4ae9-b2ac-3fe09adccf9a">Ser Davos Seaworth</card>
        <card qty="1" id="6967fd81-f9f9-4077-8d5a-c9ca189a5e41">Shireen Baratheon</card>
        <card qty="3" id="21c87233-3c2e-4a66-9ea0-ffaf5ac0594c">Fiery Followers</card>
        <card qty="3" id="2a669f95-cad1-43eb-b7a5-4aac56b411de">Dragonstone Faithful</card>
        <card qty="3" id="9e0df853-1c6d-4be2-b799-fe69524a6057">Margaery Tyrell</card>
        <card qty="3" id="dd950122-b92e-4d6b-b1f4-d8a3f623a99a">Randyll Tarly</card>
        <card qty="3" id="dfb7512e-0d80-4dff-8fdf-4807d93ba159">The Knight of Flowers</card>
        <card qty="3" id="8192ab17-f699-45b9-931b-e0933dbc01eb">Garden Caretaker</card>
        <card qty="1" id="47292ec9-f2dc-4786-b895-d92c2ae9af80">Moon Boy</card>
        <card qty="2" id="6f350923-3da1-4779-96c6-8ceb8341e81e">Asshai Priestess</card>
        <card qty="2" id="60e649e3-c3ee-4814-83bf-e39ac86a3cd7">Brienne of Tarth</card>
        <card qty="1" id="e5ac9f1c-e422-441d-b155-109040e45b25">Edric Storm</card>
      </section>
      <section name="Locations" shared="False">
        <card qty="3" id="90452d99-6a6f-4d0d-b3a1-bb92e7110d1d">The Kingsroad</card>
        <card qty="3" id="51a3e04f-3f44-4417-8d7c-1f116acd5c80">The Roseroad</card>
        <card qty="2" id="1daa814f-c6b8-4dcc-b4f7-169968be4bc5">Dragonstone Port</card>
        <card qty="2" id="3a89059b-0e56-4b47-aad7-8d2b0a245149">The Red Keep</card>
        <card qty="1" id="ef76aca1-0ad8-423e-9de0-c271943b8b4a">Caswell's Keep</card>
        <card qty="1" id="e5ac9f1c-e422-441d-b155-109040e45b42">Ocean Road</card>
      </section>
      <section name="Attachments" shared="False">
        <card qty="2" id="f5173e6f-1ec3-4ee0-8274-755160c57c0e">Bodyguard</card>
      </section>
      <section name="Events" shared="False">
        <card qty="1" id="38dd5d15-7214-4c68-9cc4-0d2abd1b2140">Put to the Sword</card>
        <card qty="1" id="b29c7bb5-7b84-4e94-a30b-8332fad51c2a">Tears of Lys</card>
        <card qty="2" id="b1092dd9-01aa-4622-9026-d905a44dd874">Consolidation of Power</card>
        <card qty="3" id="50402306-cc27-4e3e-9924-aa13f430cb60">Seen In Flames</card>
        <card qty="2" id="9d81eee2-2281-4bad-933c-9915b9eb9aca">Nightmares</card>
        <card qty="2" id="69fe7a62-2def-4e6c-9c61-4728ff354ab0">Even-Handed Justice</card>
      </section>
    <notes><![CDATA[]]></notes>
    </deck>

    Je cherche à récupérer les éléments dans un tableau qui, pour chaque ligne, comporterait les informations suivantes :

    id, qty, nom (exemple House Baratheon)
    Je sais qu'il faut utiliser les requêtes XPath pour celà et j'ai bricolé un début de code qui va dans ce sens mais je me perds un peu.

    Voici ce que j'ai fais, il doit manquer quelques trucs.

    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
    sPathXml est une chaîne = ComplèteRep(fRepExe()) + "monfichierxml.xml"
    sXML est une chaîne
    sXPath est une chaîne
    sId, sQty, sNom sont des chaînes
     
    SI XMLDocument("DocXML", sXML) ALORS
    	sXPath = "count(/deck/section)"
    	SI PAS XMLExécuteXPath("DocXML",sXPath) ALORS
    		Erreur("La requête XPath <"+sXPath+"> a échoué")
    	FIN
    	lNbTAG est entier = XMLRésultat("DocXML")
    	POUR i = 1 _A_ lNbTAG
    		sXPath = "/deck/section["+i+"]"
    		SI PAS XMLExécuteXPath("DocXML",sXPath) ALORS
    			Erreur("La requête XPath <"+sXPath+"> a échoué")
    		FIN
    		XMLFils("DocXML")
    		TANTQUE PAS XMLEnDehors("DocXML")
    			SELON XMLNomElément("DocXML")
    				CAS "id" :
    					sId = XMLDonnée("DocXML")
    				CAS "qty" :
    					sQty = XMLDonnée("DocXML")
    				// Il manque le nom ici
    			FIN
    			XMLSuivant("DocXML")
    		FIN
    	FIN
    	SI PAS XMLTermine("DocXML") ALORS
    		Erreur("Impossible de fermer le document DocXML")
    	FIN
    SINON
    	Erreur(ErreurInfo(errComplet))
    FIN
    Pourriez-vous m'aider ?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Par défaut
    Bonjour,

    Vous avez des exemples dans la doc sur base de l'utilisation des "anciennes" fonctions xml et des documents XML, conservée par "compatibilité".
    Exécuter une requête XPATH sur un document XML (syntaxe conservée par compatibilité)
    PCsoft conseille en effet maintenant d'utiliser les variables de type XML et d'abandonner les documents XML.
    Malheureusement, le Wlangage génère une confusion en utilisant le même terme xmlDocument / XMLDocument() à la casse près, pour désigner
    - la déclaration d'une variable xmlDocument
    - l'appel de la fonction XMLDocument().

    Travaillez donc plutôt avec une variable de type xmlDocument et la hiérarchie des propriétés qui en découlent.

    xlmDocument..NoeudRacine, lequel est un xmlNoeud

    Chaque xmlNoeud a des propriétés dont
    .. xmlAttribut, qui est un tableau de xmlAttribut
    ..xmlNoeudFils, qui est un tableau de nœuds etc …

    Ensuite, soit vous effectuez un parcours classique et vous avez un exemple dans la doc

    Soit vous travaillez comme vous l’avez entrepris avec xpath et vous avez aussi un exemple dans la doc (voir le 1er exemple).

    Mais dans un cas comme dans l’autre, vous retombez sur les propriétés liées aux variables de type xmlXxx.

    Un conseil : Imprégnez-vous bien des remarques en bas de la doc consacrée à la variable xmlDocument.

    Bon travail et bonne semaine

    Hemgé

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut
    Bonjour,

    Merci pour les pistes, je venais justement de voir pour travailler avec le type xmldocument.

    Voici ce que j'ai bricolé, plus qu'à tester si ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PROCEDURE ImportDeck(MonDeck est une chaîne)
     
    MonDocXML est un xmlDocument, description = ModeleDeck
     
    tabCartes est un tableau de StructCartes
    // Chargement d'un document XML depuis un fichier
    MonDocXML = XMLOuvre(MonDeck, depuisFichier)
    xmlCarte est un xmlNoeud, description="ModeleDeck.deck.section"
    POUR TOUTE xmlCarte DE MonDocXML.deck
    	TableauAjouteLigne(tabCartes,[xmlCarte.card:id,xmlCarte.card:qty,xmlCarte.card])
    FIN
    RENVOYER tabCartes
    Dans le code du projet, j'ai défini la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    StructCartes est une Structure
    	id est une chaîne
    	qty est un entier
    	nom est une chaîne
    FIN
    Je pense que c'est la bonne piste, plus qu'à ajuster si besoin.

    EDIT : après test, cela récupère bien les infos mais uniquement pour la première "card" de chaque "section". Et j'ai beau chercher, je ne trouve pas comment récupérer les infos des autres "card".

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    hello,
    d'après la structure de ton fichier xml, les "card" sont imbriquées dans les "section". Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sect est un xmlNoeud,Description="ModeleDeck.deck.section"
    carte est un xmlNoeud,Description="ModeleDeck.deck.section.card"
    	POUR TOUT sect DE ModeleDeck.deck
    		Trace("section : ",sect:name)
    		POUR TOUT carte DE sect
    			Trace("carte : ",carte," - ",carte:id," - ",carte:qty)
    		FIN										
    	FIN
    devrait faire l'affaire

    Ami calmant, J.P

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut
    Bien vu, c'était effectivement ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer les valeurs d'un fichier xml avec xmllint.
    Par gabydebur dans le forum Linux
    Réponses: 10
    Dernier message: 29/09/2016, 18h47
  2. recuperer les valeurs d'un fichier xml
    Par gentil dans le forum C#
    Réponses: 5
    Dernier message: 16/02/2008, 20h55
  3. [DOM] Récupérer les attributs d'un fichier XML en PHP
    Par ePsymon dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/02/2008, 11h51
  4. [XSL]récupérer une valeur de plusieurs fichiers XML
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 05/02/2006, 00h32
  5. [](VB) Récupérer les données dans un fichier .xml
    Par Furius dans le forum VBScript
    Réponses: 4
    Dernier message: 02/10/2005, 20h39

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