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

XML/XSL et SOAP Discussion :

Lecture de données d'un xml


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut Lecture de données d'un xml
    Bonjour à tous,

    Je me permets de vous contacter car cela fait plusieurs jours que je galère à obtenir mon résultat final.
    J'ai un fichier XML (cf pièce jointe) qui n'a pas une arborescence concrète tel que parent--> fils--> petit fils--> etc. Donc il est difficile de faire une boucle pour extraire des données à l'aide de VBA.

    Je m'explique. Je souhaite extraire certaines données comprises entre différentes lignes de mon fichier xml. Pour cela j'ai créé une boucle qui permet de créer une feuille ou d'effacer la feuille si elle est déjà existante afin de renseigner par feuille des informations.

    Voici le code:

    Code vba : 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
    For Each WF_classElement In Gfi_XMLDoc(Gfi_Position_modele(Gfi_indice_modele)).SelectNodes("/PLMXML/WorkflowTemplate")
     
        Gfi_module_enCours = Gfi_indice_modele
     
        GFI_a7_WF_className = WF_classElement.getAttribute("name")
        GFI_a7_WF_className_trunc = Left(GFI_a7_WF_className, 30)
     
        GFI_a7_WF_iconKey = WF_classElement.getAttribute("iconKey")
     
        If (InStrRev(GFI_a7_WF_iconKey, "process", , vbTextCompare) > 0) Then
     
        If fct_WsExist(GFI_a7_WF_className_trunc) Then
            Sheets(GFI_a7_WF_className_trunc).Cells.Clear
            Sheets(GFI_a7_WF_className_trunc).Cells.ClearContents
            Sheets(GFI_a7_WF_className_trunc).Activate
        Else
            ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
            ActiveSheet.Name = GFI_a7_WF_className_trunc
     
        End If
     
       Else
           GoTo Next_Sentence
        End If
     
           Set WF_articles_autoriseElement = Gfi_XMLDoc(Gfi_Position_modele(Gfi_indice_modele)).SelectNodes("/PLMXML/WorkflowBusinessRuleHandler[@name='EPM-check-target-object']/Arguments/UserValue")
     
                GFI_a7_articles_autorisés = WF_articles_autoriseElement(0).getAttribute("value")
     
                If (InStrRev(GFI_a7_articles_autorisés, "-status_allow=", , vbTextCompare) > 0) Then
                    Sheets(GFI_a7_WF_className_trunc).Cells(7, 3).Value = GFI_a7_articles_autorisés
                End If
     
    Next_Sentence:
     
     
    Next
     
    EXIT_SUB:
     
    End Sub


    En se référençant au fichier xml en pièce jointe, mon code créé bien une feuille par nœud sélectionné. Le problème arrive au niveau de l'information que je souhaite renseigner par feuille. Mon code renseigne à chaque fois la même valeur sur chaque feuille et ce n'est pas ce que je souhaite.

    J'aimerai que la boucle ne recommence par à lire le fichier xml dès le début et qu'il continue de lire le fichier.
    En expliquant le fichier xml, il créé une feuille pour les lignes suivantes:
    6-->286 (I10)
    287-->632 (I20)
    633-->839 (I21)
    840-->1028 (I30)
    1029-->1294 (I31)
    1295-->1354 (I60)
    1355-->1414 (I61)
    1415-->1474 (I63)
    1475--> fin (I64)

    J'aimerai donc qu'entre chaque intervalle (n° ligne), le code ne prenne uniquement que les informations comprises dans ces intervalles.

    J'espère avoir été assez claire. Si ce n'est pas le cas dites le moi et j'apporterai des précisions.

    Je vous remercie d'avance pour vos réponses et pour le temps utilisés pour traiter mon problème.

    Cordialement,
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je ne connais rien au VBA et ne peux pas t'aider de toute façon mais, au cas où quelqu'un d'autre pourrait le faire, et dans le cadre de ta question,

    je te suggère de faire un exemple de fichier XML beaucoup, beaucoup plus petit (une dizaine de lignes max,) de l'indenter correctement, et de le mettre dans le post plutôt qu'en attachement puisqu'il est devenu petit.
    Cela permettrait de s'y retrouver. Le fichier à données réelles n'est pas utile.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut
    Bonjour,

    Tout d'abord, je tiens à vous remercier Thelvin pour votre réponse et votre conseil.

    Ensuite, en suivant le conseil de Thelvin, veuillez trouver en pièce jointe une partie de mon xml nommé "test.xml".

    De plus, voici le code que j'utilise et que j'ai modifié pour le xml:

    Code vba : 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
    65
    66
    67
    68
    69
    70
    71
    'Initialisation d'un parseur
    Set Gfi_XMLDoc(Gfi_Index) = CreateObject("Microsoft.XMLDOM")
     
    'Chargement du fichier en mémoire avant de commencer à le parser
     Gfi_XMLDoc(Gfi_Index).Async = "False"
     Gfi_NomFichierBMIDE = Application.GetOpenFilename("xml Files (*.xml), *.xml, Text Files (*.txt), *.txt, All Files (*.*), *.*", 1, "Selection du Fichier")
     Gfi_XMLDoc(Gfi_Index).Load (Gfi_NomFichierBMIDE)
     Gfi_XMLDoc_file(Gfi_Index) = Gfi_NomFichierBMIDE
     
     
    For Each WF_classElement In Gfi_XMLDoc(Gfi_Position_modele(Gfi_indice_modele)).SelectNodes("/PLMXML/WorkflowTemplate")
     
        Gfi_module_enCours = Gfi_indice_modele
     
        GFI_a7_WF_className = WF_classElement.getAttribute("name")
        GFI_a7_WF_className_trunc = Left(GFI_a7_WF_className, 30)
     
        GFI_a7_WF_iconKey = WF_classElement.getAttribute("iconKey")
     
        If (InStrRev(GFI_a7_WF_iconKey, "process", , vbTextCompare) > 0) Then
     
        If fct_WsExist(GFI_a7_WF_className_trunc) Then
            Sheets(GFI_a7_WF_className_trunc).Cells.Clear
            Sheets(GFI_a7_WF_className_trunc).Cells.ClearContents
            Sheets(GFI_a7_WF_className_trunc).Activate
        Else
            ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
            ActiveSheet.Name = GFI_a7_WF_className_trunc
     
        End If
     
       Else
           GoTo Next_Sentence
        End If
     
        'Renseignement des deux informations sur la ligne 2
        Sheets(GFI_a7_WF_className_trunc).Cells(2, 3).Value = GFI_a7_WF_className
     
        'Renseignement des deux informations sur la ligne 7
        For Each WF_articles_autoriseElement In Gfi_XMLDoc(Gfi_Position_modele(Gfi_indice_modele)).SelectNodes("/PLMXML/WorkflowBusinessRuleHandler[@name='EPM-check-target-object']/Arguments/UserValue")
     
            GFI_a7_articles_autorisés = WF_articles_autoriseElement.getAttribute("value")
     
            If (InStrRev(GFI_a7_articles_autorisés, "-status_allow=", , vbTextCompare) > 0) Then
                Sheets(GFI_a7_WF_className_trunc).Cells(7, 3).Value = GFI_a7_articles_autorisés
                Exit For
                End If
        Next
     
     
        'Renseignement des deux informations sur la ligne 9
        For Each WF_status_autoriseElement In Gfi_XMLDoc(Gfi_Position_modele(Gfi_indice_modele)).SelectNodes("/PLMXML/WorkflowBusinessRuleHandler/Arguments/UserValue")
     
            GFI_a7_status_autorisés = WF_status_autoriseElement.getAttribute("value")
     
            If (InStrRev(GFI_a7_status_autorisés, "-status_disallow=", , vbTextCompare) > 0) Then
                Sheets(GFI_a7_WF_className_trunc).Cells(9, 3).Value = Mid(GFI_a7_status_autorisés, 18)
                Exit For
            End If
     
        Next
     
     
    Next_Sentence:
     
     
    Next
     
    EXIT_SUB:
     
    End Sub


    Pour revenir à mon problème, voici ce que mon code me génère sur mon fichier Excel:
    Feuille I10 Promote Advanced
    ligne 2: I10 Promote Advanced
    ligne 7: -status_allow=none
    ligne 9: A7_Advanced,A7_Obsolete,A7_Released,A7_PreReleased

    Feuille I20 Promote PreReleased
    ligne 2: I20 Promote PreReleased
    ligne 7: -status_allow=none
    ligne 9: A7_Advanced,A7_Obsolete,A7_Released,A7_PreReleased

    Feuille I21 Promote PreReleased
    ligne 2: I21 Promote PreReleased
    ligne 7: -status_allow=none
    ligne 9: A7_Advanced,A7_Obsolete,A7_Released,A7_PreReleased

    Or ce que je souhaite obtenir c'est ceci:
    Feuille I10 Promote Advanced
    ligne 2: I10 Promote Advanced
    ligne 7: -status_allow=none
    ligne 9: A7_Advanced,A7_Obsolete,A7_Released,A7_PreReleased

    Feuille I20 Promote PreReleased
    ligne 2: I20 Promote PreReleased
    ligne 7: -status_allow=A7_Advanced
    ligne 9: A7_Obsolete,A7_Released,A7_PreReleased

    Feuille I21 Promote PreReleased
    ligne 2: I21 Promote PreReleased
    ligne 7: -status_allow=A7_Advanced
    ligne 9: A7_Obsolete,A7_Released,A7_PreReleased

    Il faut savoir que chaque feuille a des informations différentes des autres.

    J'attends votre aide.

    En attendant vos réponses, je vous remercie d'avance.

    Cordialement,
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    n'ayant pas ton fichier excel et n'ayant pas le temps de le recréer, je dirai en regardant ton code que le problème vient de tes exit for au milieu des 2 dernières boucles.
    Tu appelles tous les noeuds uservalue et systématiquement tu vas arrêter ta boucle au bout de l'évaluation du premier noeud (pour la première boucle) et du 2ème noeud pour la deuxième boucle. Du coup sur toutes tes feuilles tu obtiens les résultats correspondant à ces 2 noeuds.

    Ton problème n'est pas lié à XML mais à ton algorithmique il me semble.

    Tu devrai vérifier le nombre de tour de boucles que tu effectues vraiment.

    UTilises les instructions debug.print pour afficher des résultats intermédiaires (CTRL+G pour afficher la fenêtre exécution qui te permettra de voir ces résultats intermédiaires).

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut
    Bonjour Benjîle,

    Tout d'abord merci pour le temps passé pour étudier mon problème et pour me répondre.

    Je suis d'accord avec vous, le problème ne vient pas de mon fichier XML mais de mon code VBA.

    En ce qui concerne le "Exit For" de mon code, j'avais déjà testé sans. Le problème change, toutes les feuilles générées sont identiques à par la première information contenue en ligne 2 de chaque feuille.
    C'est-à-dire que mon code renseigne les dernières valeurs trouvées dans le fichier XML pour les lignes 7 et 9.
    Donc mon code écrit les informations les unes sur les autres jusqu'à la fin de la lecture du fichier xml.
    Comment faire pour que chaque valeur soit renseignée dans la bonne feuille?

    Merci d'avance.

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    si on regarde ton fichier xml on constate que l'ordre des balises workflowtemplate, workflowbusinesshandler,workflowsbusinesshandler est porteur d'une information.
    Ces 3 informations se succèdent systématiquement car elle constitue une information. Concrètement cela veut dire que chaque balise workflowtemplate va de pair avec les 2 balises qui la suive. C'est là dessus qu'il faut s'appuyer.

    Algo de la boucle:

    pour chaque noeud /PLMXML/WorkflowTemplate

    - appliquer le traitement de ta première boucle

    - sélectionner le noeud qui le suit (son voisin alias sibling) quelque soit son nom (workflowsbusinesshandler ) pour appliquer le traitement de ta 2ème boucle

    - sélectionner le noeud qui le suit (son voisin alias sibling) quelque soit son nom
    (workflowsbusinesshandler ) pour appliquer le traitement de ta 3ème boucle

    noeud suivant WorkflowTemplate (fin de pour)

    On ne fait donc pas 3 boucles successives mais une seule

    Sinon tu crées une collection de noeuds enfants de PLMXML (tousles éléments header, workflowtemp et tu démarres une boucle sur cette collection à partir de l'élément 2 (le premier workflowtemplate) jusqu'au dernier élément de la collection en faisant 1 pas de 3 (for i=2 to n step 3)
    Ainsi pour chaque i l'élément i+1 et i+2 sont les workflowbusinesshandler à traiter alors que l'élément i est le workflowtemplate correspondant.

Discussions similaires

  1. [WD17] Lecture de données XML
    Par thierrybatlle dans le forum WinDev
    Réponses: 7
    Dernier message: 09/11/2013, 21h18
  2. [Visiteur] [C#] Lecture de données XML, Csv
    Par al2000 dans le forum Design Patterns
    Réponses: 1
    Dernier message: 19/07/2011, 15h09
  3. Xml datasource Probleme de lecture des données
    Par gazzall dans le forum Jasper
    Réponses: 1
    Dernier message: 29/03/2007, 11h18
  4. [AJAX] Lecture de données XML
    Par flgwen dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/01/2007, 09h34
  5. [FLASH MX2004] [XML] Lecture de données XML
    Par ZiT dans le forum Flash
    Réponses: 1
    Dernier message: 12/07/2005, 11h51

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