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

  1. #1
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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 expérimenté
    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
    Points : 1 394
    Points
    1 394
    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
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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 expérimenté
    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
    Points : 1 394
    Points
    1 394
    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.

  7. #7
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour vos réponses.

    Je comprends très bien ce que vous me conseillez de faire.

    Le problème c'est que le fichier xml que vous regardez est très simplifier. Si vous vous référencez à mon premier message et au fichier xml "WF_SerieI_Document.xml" il est totalement plus compliqué et donc les balises ne sont pas du tout voisines.

    En fait, je souhaiterai que mon code puisse caractériser la première boucle avec la balise "WorkflowBusinessRuleHandler" comme balise père de mon fichier vu qu'il n'a pas d'arborescence.

    D'avance merci.

  8. #8
    Membre expérimenté
    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
    Points : 1 394
    Points
    1 394
    Par défaut
    dans votre fichier xml de départ il n'y a à mon sens aucune information permettant de relier les balises workflowtemplate accessintent workflowaction workflowbusinessrule et workflowbusinessrule handler si ce n'est l'ordre dans lequel les balises sont présentées. Concrètement dès que l'on atteint une balise workflowtemplate les éléments suivants sont relatifs à cette balise. Est ce que je me trompe?

    Si c'est le cas je pense qu'il serait plus efficaced'appliquer une feuille de style xsl qui permette de transformer cet arbre en un arbre plus simple permettant d'appliquer la boucle dont je vous parle ou carrément d'un XML avec une logique arborescente.

  9. #9
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    C'est presque ça car si vous regardez bien le fichier il y a plusieurs balises "WorkflowTemplate".
    Toutes les informations situées après la balise "WorkflowTemplate" (contenant l'information iconKey="process")) jusqu'à la prochaine balise "WorkflowTemplate" (contenant l'information iconKey="process")) appartiennent à la première balise.

    Votre proposition sur la feuille de style xsl me semble intéressante même si je ne connais pas son fonctionnement. Si vous avez des liens, des cours, ou des formations, la dessus, je suis preneur afin de pouvoir explorer cette piste.
    Tandis que votre deuxième est impossible car le fichier xml est générée depuis une base de données.

    Merci d'avance pour tous ces conseils.

  10. #10
    Membre expérimenté
    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
    Points : 1 394
    Points
    1 394
    Par défaut
    les tutos sont en haut de ce forum dans tutoriel xml.

    PS: quelle est le serveur de bases de données, certains comme comme sql server ont une bonne implémentation d 'XML ce qui permet d'obtenir des arbres XML pertinent avec des requêtes select.

  11. #11
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Merci pour toutes vos réponses.

    PS: Le fichier XML est généré suite à l'extraction de la base de données utilisées par un autre logiciel.

  12. #12
    Membre expérimenté
    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
    Points : 1 394
    Points
    1 394
    Par défaut
    cette feuille de style XSL:
    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
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    	<xsl:output method="xml" indent="yes"/>
    	<xsl:template match="/PLMXML">
    		<xsl:copy>
    			<xsl:apply-templates/>
    		</xsl:copy>
    	</xsl:template>
    	<xsl:template match="//WorkflowTemplate[@iconKey='process']">
    		<xsl:copy-of select="."/>
    	</xsl:template>
    	<xsl:template match="//WorkflowBusinessRuleHandler">
    		<xsl:copy-of select="."/>
    	</xsl:template>
    	<xsl:template match="//WorkflowBusinessRule">
    		<xsl:copy-of select="."/>
    	</xsl:template>
    </xsl:stylesheet>

    nous donne le fichier xml en PJ à partir de la première source.

    Est ce qu'on va dans la bonne direction?
    Fichiers attachés Fichiers attachés

  13. #13
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Merci pour ce bout de code XSL.

    Je pense comprendre un peu le fonctionnement mais dans ce domaine et langage, je suis ultra novice.

    Pouvez-vous m'expliquer comment l'utiliser et comment il fonctionne réellement afin que je puis retranscrire ce code à mon fichier xml de base?

  14. #14
    Membre expérimenté
    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
    Points : 1 394
    Points
    1 394
    Par défaut
    XSL est un langage fonctionnel. Il est utilisé par un processeur XSL (saxon, msxml, xalan,....).
    Celui-ci parcoure tous les noeuds d'un fichier XML et pour chaque noeud applique un traitement. Les traitements se déclarent dans une feuille de style XSL par le biais de fonction (xsl:template).

    Si je déclare une fonction (template) ainsi:

    <xsl:template match="//monnoeud">

    dès que le processeur XSL rencontrera monnoeud (où qu'il soit placé, voir XPATH) il appliquera cette fonction.

    Ici le processeur XSL commence par lire le noeud PLMXML, il constate qu'une fonction existe qui s'applique à lui (template match="/PLMXML"). Il applique le traitement correspondant.
    Dans ce traitement il recopie le noeud PLMXML en le débarassant de ses attributs et de ses noeuds enfants (xsl:copy) puis il va parcourir les noeuds enfants de PLMXML pour leur appliquer les traitements nécessaires (xsl:apply-templates) et mettre le résultat dans le noeud copié (le apply -templates est dans le xsl:copy).

    Lors du parcours des noeuds enfants il rencontre les noeuds suivants (entre autres):
    -//WorkflowTemplate[@iconKey='process']
    -//WorkflowBusinessRuleHandler
    -//WorkflowBusinessRule

    pour chacun de ces noeuds il trouve une fonction à lui appliquer dans la feuille de style XSL et donc leur applique le traitement correspondant: il s'agit d'une copie du noeud avec tous ses éléments enfants.


    Les fonctions sont appliquées dans l'ordre où les noeuds sont présentés dans le fichier source et produise leurs sorties dans cet ordre (ceci est lié à la façon dont j'ai écrit le XSL)

    Le résultat final de cette feuille de style est le fichier source XML filtré des balises dont nous n'avons pas besoin

    PS: le code XSL aurait pu être simplifié ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    	<xsl:output method="xml" indent="yes"/>
    	<xsl:template match="/PLMXML">
    		<xsl:copy>
    			<xsl:apply-templates/>
    		</xsl:copy>
    	</xsl:template>
    	<xsl:template match="//WorkflowTemplate[@iconKey='process'] | //WorkflowBusinessRuleHandler | //WorkflowBusinessRule">
    		<xsl:copy-of select="."/>
    	</xsl:template>
    </xsl:stylesheet>


    Pour l'exploiter il te faut pour démarrer un éditeur XML (exchanger XML, Altova,...). Puis tu demandes une transformation XSL en donnant pour source le xml et comme feuille de style le xsl. Indiquer que la transformation doit se faire en XSLT 2.0 (je ne suis pas sûr de moi mais je pense que ça passe aussi avec XSLT 1.0)

    Par la suite tu pourras t'occupper de l'API pour intégrer la transformation dans ton code. j'ai posté sur ce forum un bout de code faisant cette opération en VBScript

    PPS: le fichier XML que j'ai mis en pièce jointe de mon précédent post est le XML transformé à partir du premier fichier que vous avez posté.

  15. #15
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Franchement je vous remercie sincèrement. Je pense avoir compris le fonctionnement.
    Or je vais vous poser une question qui va vous paraître sûrement ridicule mais comment je lance ou j'applique ce code? Faut-il que je le copie dans mon code VBA ou dans mon fichier XML?
    Je n'ai pas suivi une formation d'informatique donc je suis entrain de m'auto-former sur plusieurs notions informatiques comme le XML, le VBA.

    Je vous remercie encore. Toutes vos réponses me donnent vraiment l'impression de me rapprocher de mon but final.

  16. #16
    Membre expérimenté
    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
    Points : 1 394
    Points
    1 394
    Par défaut
    le code xsl doit être dans un fichier à part (avec extension XSL éventuellement).

    Pour l'application commencez par télécharger un éditeur XML parmi ceux que j'ai cité (ou d'autres). Avec le logiciel ouvrez le fichier XML et le fichier XSL, cherchez dans les menus une opération nommée Transformation XSL, indiquez en source le xml en trandsformation le xsl et la version 1.0 et le 2.0

  17. #17
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Merci pour toutes ces informations mais je n'ai pas dû tout comprendre.

    Pour information le logiciel que j'utilise pour mon fichier xml est Notepad++.
    Et avec ce logiciel là, je n'arrive pas à trouver la commande Transformation XSL (peut-être quelle n'existe pas).
    Comment puis-je exécuter la même commande?

    Veuillez trouver en pièce jointe ce que j'aimerai obtenir pour fichier xml.

    Par rapport à ce fichier xml je souhaite que sur chaque feuille générée par mon code VBA, il y ait que les informations comprises entre chaque balise " WorkflowTemplate". Donc en faisant simple, la première feuille contient toutes les informations de la premier balise "WorkflowTemplate", la deuxième feuille contient toutes les informations de la seconde balise "WorkflowTemplate" et ainsi de suite.
    Je pense que dans le code que j'ai pu fournir précédemment, j'ai un problème au niveau de la sélection de mes nœuds vu que j'obtiens sur chaque feuille la même chose.

    Pouvez-vous m'orienter sur la façon de générer ma boucle de départ et comment obtenir uniquement les informations comprises entre chaque balise "WorkflowTemplate"?

    Je vous en remercie d'avance.
    Fichiers attachés Fichiers attachés

  18. #18
    Membre expérimenté
    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
    Points : 1 394
    Points
    1 394
    Par défaut
    Pour notepadd++ il faut passer par le pluginn manager pour ajouter XML tools.
    Vous disposerez de capacités de traitement XML et XSL après cela.

    Pour le fichier XML que vous souhaitez obtenir dans l'immédiat je ne vois pas de façon simple de le faire mais je suis loin d'être un expert XSL. D'autres ici comme notre modo seront bien plus apte à répondre à votre question. Je vais le reformuler pour vous plus loin. Cependant je pense que le fichier XML que je vous fournis suffit en VBA pour faire ce que vous voulez faire, il suffit de parcourir les noeuds enfants de PLMXML et d'étudier leur nom pour savoir quoi faire.

    Pour le problème que vous posez on peut l'écrire ainsi.
    source xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <a>1</a>
    <b>2</b>
    <b>3</b>
    <c>4</c>
    <a>5</a>
    <b>6</b>
    <c>7</c>
    <b>8</b>

    résultat xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <a>1
        <b>2</b>
        <b>3</b>
        <c>4</c>
    </a>
    <a>5
         <b>6</b>
         <c>7</c>
         <b>8</b>
    </a>

  19. #19
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Un grand merci à vous Benjîle pour toutes vos remarques, et vos propositions.
    Je vais essayer d'avancer avec tout ça.

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