XL 2010 Boucles imbriquées et fichier XML à géométrie variable

Twing83

XLDnaute Junior
Bonjour,
Je vais tenter de décrire mon problème le plus précisément possible pour ne pas faire perdre son temps à tous ceux qui voudront bien se donner la peine de se pencher sur ce sujet.
J'ai une collection de fichiers XML que je veux importer dans des feuille XLS, mais je bloque sur une partie des fichiers qui sont à géométrie variable.
- Un fichier XML peut contenir "n" <item classId="xx" IdNumber="x">
- Pour 1 <item classId="xx" IdNumber="x">, il peut y avoir jusqu'à 8 <divisionReport divisionId="xx"...
- Pour chaque <divisionReport divisionId="xx", il peut y avoir jusqu'à 4 <item subDivisionId="xx"...
Je souhaite importer les données dans une feuille XLS dont j'ai structuré les colonnes en conséquence, mais ça ne se passe pas comme je veux, bref je ne m'en sort pas !
Je joints les fichiers XML et mon fichier de test.
Votre aide sera précieuse...

XML:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<data sessionId="001">
    <dataList>
        <item classId="259" IdNumber="1">
            <globalReport>
                <report>
                    <detailedReport System="ENGINE_FRONT_ID" State="OPERATIVE">
                        <syntheticDetailedReport>
                            <syntheticDetailedReport>
                                <divisionReport divisionId="11" minReturns="4011" returns="9011">
                                    <subDivisionList>
                                        <item subDivisionId="11" subDivisionType="FULL_THROTTLE" />
                                        <item subDivisionId="12" subDivisionType="FULL_THROTTLE" />
                                        <item subDivisionId="13" subDivisionType="FULL_THROTTLE" />
                                        <item subDivisionId="14" subDivisionType="FULL_THROTTLE" />
                                    </subDivisionList>
                                </divisionReport>
                                <divisionReport divisionId="12" minReturns="4012" returns="9012">
                                    <subDivisionList>
                                        <item subDivisionId="21" subDivisionType="REDUCED_THROTTLE" />
                                        <item subDivisionId="22" subDivisionType="REDUCED_THROTTLE" />
                                        <item subDivisionId="23" subDivisionType="REDUCED_THROTTLE" />
                                        <item subDivisionId="24" subDivisionType="REDUCED_THROTTLE" />
                                    </subDivisionList>
                                </divisionReport>
                            </syntheticDetailedReport>
                        </syntheticDetailedReport>
                    </detailedReport>
                </report>
            </globalReport>
        </item>
        <item classId="270" IdNumber="1">
            <globalReport>
                <report>
                    <detailedReport System="ENGINE_FRONT_ID" State="OPERATIVE">
                        <syntheticDetailedReport>
                            <syntheticDetailedReport>
                                <divisionReport divisionId="21" minReturns="4021" returns="9021">
                                    <subDivisionList>
                                        <item subDivisionId="111" subDivisionType="FULL_THROTTLE" />
                                        <item subDivisionId="121" subDivisionType="FULL_THROTTLE" />
                                        <item subDivisionId="131" subDivisionType="FULL_THROTTLE" />
                                        <item subDivisionId="141" subDivisionType="FULL_THROTTLE" />
                                    </subDivisionList>
                                </divisionReport>
                                <divisionReport divisionId="22" minReturns="4022" returns="9022">
                                    <subDivisionList>
                                        <item subDivisionId="212" subDivisionType="REDUCED_THROTTLE" />
                                        <item subDivisionId="222" subDivisionType="REDUCED_THROTTLE" />
                                        <item subDivisionId="232" subDivisionType="REDUCED_THROTTLE" />
                                        <item subDivisionId="242" subDivisionType="REDUCED_THROTTLE" />
                                    </subDivisionList>
                                </divisionReport>
                            </syntheticDetailedReport>
                        </syntheticDetailedReport>
                    </detailedReport>
                </report>
            </globalReport>
        </item>
    </dataList>
</data>
 

Pièces jointes

  • test_boucle.zip
    26.5 KB · Affichages: 10
Solution
pour les classid qui ne serait pas des item classid....
j'ai modifié la fonction
j'ai transformé la fonction getelementsbyattribut en getelementsbytagandattribut
comme ça elle collectionne que les éléments <item classId..."

comme ca il n'y aura pas d'ambiguité avec <datalist classId.... et< item classId ...
remplace le code du module
VB:
'*********************************************************
'xml parser designed by patricktoulon for twing83 on XLD
'version 2.0
'author patricktoulon
'*********************************************************
Option Explicit
Sub test()
Dim fichier As Variant, i&
    fichier = Application.GetOpenFilename("Text Files (*.xml), *.xml", 1, "ouvrir un fichier XML", , True)
    If Not...

patricktoulon

XLDnaute Barbatruc
bonjour
- Un fichier XML peut contenir "n" <item classId="xx" IdNumber="x">
- Pour 1 <item classId="xx" IdNumber="x">, il peut y avoir jusqu'à 8 <divisionReport divisionId="xx"...
- Pour chaque <divisionReport divisionId="xx", il peut y avoir jusqu'à 4 <item subDivisionId="xx"...
ça me parait assez simple à moi en fait
il te suffit de créer un tableau avec le max de colonnes concernant ces données (8 et 4)
d'autant plus que c'est encore plus simple puisque tu créée ton tableau en fonction des attributs et non des tag a part pour les lignes datasession--> item
alors sur certains il y aura des cellules vides car il y en aura moins qu'un autre mais tes données seront dans les bonnes colonnes

ça veut dire en fait que ton tableau va comporter 8*4 colonnes pour les divisonreport et subdivision
meme si dans tes exemple doc1 et doc2 il n'y en a que 2 divisionreport et 4 subdivision dans chaque
 

Twing83

XLDnaute Junior
Bonsoir patricktoulon,
C'est ce que j'ai fait, 8 divisionId avec 4 subdivisionId.
Je m'en sors à peu près pour les divsionId, mais dès que je m'attaque aux subdivisionId ça part en cacahouètes :)
subdivisionid2-1 devrait être de 21 alors que j'ai l'impression que je boucle sur le 1er divisionId.
En te remerciant par avance
 

Twing83

XLDnaute Junior
re
A toi de jouer alors 😉
J'ai hâte de voir comment tu vas procéder, personnellement j'ai testé tellement d'options que je ne sais plus lesquelles j'ai ou non testées...
Merci à toi pour aide...
 

Pièces jointes

  • Test_boucle.xlsx
    11.6 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
je n'avais pas vu que c’était les item classId les noeuds principaux
et si je te proposais plutôt une ligne pour chaque item classid avec leur division et sub division respective
en colonne A on garderai l'index de data session id
comme ceci
testé sur le fichier doc1
demo.gif
 

Twing83

XLDnaute Junior
Bonjour Patrick,
Je vais essayer avec mon jeu de données...
J'ai tout de même un doute sur le principe de "multiplier" les lignes avec le même "sessionId".
Dans mon projet j'ai environ une soixantaine de feuilles (nombreux XML et surtout très volumineux) toutes référencées par cet attribut et excepté pour ce cas, j'ai 1 ligne par sessionId.
Je regarde ce que ça donne et surtout si les traitements après import seront possibles.
Un grand merci néanmoins pour ton investissement :)
 

patricktoulon

XLDnaute Barbatruc
re
bonjour
le problème à faire sur une seule ligne est que tu fausse les données
car par exemple dans le doc 1
il y a le premier classId 259 avec ses divisions et subdivisions
et
le 2ème avec classId 270 avec ses divisions et subdivisions

dans ton exemple au départ tu ne garde que le classId 259(le 1er)

les divisions et subdivisions du 270 n'ont rien a voir avec le 259
 

Twing83

XLDnaute Junior
Bonsoir Patrick,
Je viens de faire quelques essais mais ce n'est pas concluant...
Je m'explique...
Dans le tableau je devrais récupérer :
divisionId1 "11", subDivisionId1-1 "11", subDivisionId1-2 "12"...
divisionId2 "12", subDivisionId2-1 "21", subDivisionId2-2 "22"...
etc...
 

Statistiques des forums

Discussions
315 091
Messages
2 116 109
Membres
112 662
dernier inscrit
lou75