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

Macros et VBA Excel Discussion :

VBA et bibliothèque IXMLDOMNode (gestion XML) : profondeur d'arborescence [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut VBA et bibliothèque IXMLDOMNode (gestion XML) : profondeur d'arborescence
    Bonjour,
    J'ai essayé de rendre le titre compréhensible mais c'est pas gagné
    Ma macro ouvre des fichiers de dessin au format .svg qui est un format xml. Pas de soucis pour utiliser la bibliothèque IXMLDOM.
    Mon problème c'est de gérer les imbrications de balise <g>. Je vous donne un exemple simplifié :
    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
    <svg
    width="4000" height="6000" version="1.1" >
    <title>Le joli plan du siège mondial de developpez.net</title>
     
    <g id="zone 1" >
      <g id="sous_groupe 1">
            <path id="fosse" d="M 714.274,3026.228Q721.6679,3021.7303 724.3654,3017.3556C726.5549,3013.8046 725.6282,3010.788 726.4913,3006.4139C727.295,3002.3408z" style=" fill:None; stroke:#000" />
     	<polyline  id="mur M12" fill="none" stroke="#000000"  stroke-width="0.1" points="1810.772,2218.874 1810.772,2228.874 1810.772,2223.874       1805.772,2223.874 1815.772,2223.874     " />
     
      </g>  
      <g id="sous_groupe 2"> 
            <path  id="mur M13" d="M 714.274,3026.228Q721.6679,3021.7303 724.3654,3017.3556C726.5549,3013.8046 725.6282,3010.788 726.4913,3006.4139C727.295,3002.3408z" style=" fill:None; stroke:#000" />
     	<polyline  id="mur M14" fill="none" stroke="#000000"  stroke-width="0.1" points="1810.772,2218.874 1810.772,2228.874 1810.772,2223.874       1805.772,2223.874 1815.772,2223.874     " />
            <g>
                    <polygon  id="mur M15" fill="none" stroke="#000000"  stroke-width="0.1" points="1810.772,2218.874 1810.772,2228.874 1810.772,2223.874     " />
            </g>
      </g> 
    </g>
      <g id="autre zone"> 
        <path d="M 691.0583,2905.4721C692.6233,2908.3657 697.6717,2908.9186  691.0583,2905.4721z" style=" fill:None;stroke-width:0.1; stroke:#000" />
      </g>  
     
    </svg>
    En svg, la balise <g> correspond aux calques/sous-calques visibles sur un logiciel de dessin vectoriel tel qu'Illustrator.
    Il y a donc des <g> dans des <g> un nombre indéterminé de fois.
    Je voudrais récupérer les identifiants de ces balises <g> et les saisir en BDD .
    Je précise que les <g> n'ont pas forcément d'identifiant unique. Donc pas possible de se reposer là-dessus

    A la base, facile, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim xNode As IXMLDOMNode, nitem As IXMLDOMAttribute, identifiant as string
    For Each nitem In xNode.Attributes
             If nitem.Name = "id" Then
                   dentifiant = nitem.Value
             End If
    Next
    Mais comment garder les identifiants des <g> dans lesquels sont placés les balises <path>, <polyline> ou autres ?
    En clair, en suivant l'exemple plus haut, je voudrais par exemple avoir comme info : le <path> id = "fosse" appartient à zone1 / sous-groupe1
    Ce qui implique de savoir où je suis dans l'arborescence et ne pas mélanger les <g> "frères"
    Si vous avez une solution, je suis preneur. Si j'ai pas été clair, j'en suis désolé, dites-le moi et je tâcherai de ré-expliquer.
    Merci d'avance

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    Bonjour,

    Rien compris.

    Mais on trouve le parent avec parentNode.
    Une boucle si besoin de remonter plusieurs niveaux jusqu'à ce que le parentNode soit Nothing.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour Arkham46,
    et merci pour ton tuto sur le sujet, il m'a été bien utile.
    Désolé, oui j'ai du mal à expliquer. Mais à ta réponse, tu as compris le principe.
    Ce que tu proposes, c'est de partir du dernier élément (l'arrière petit-enfant...) pour ensuite remonter les générations.
    Suite à ta réponse, j'ai commis ce code :
    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
     
    Sub parcourir_noeuds(n As IXMLDOMNode)
     
        Dim mesparents As IXMLDOMElement, xNode As IXMLDOMNode,  nitem As IXMLDOMAttribute, identifiant As String
     
        If n.ChildNodes.Length = 0 Then Exit Sub
     
        'je fais le tour des mioches
        For Each xNode In n.ChildNodes
     
            'si je tombe sur une balise de dessin par exemple ici <path>
            If xNode.nodeName = "path" Then
                'je remonte la généalogie pour trouver les identifiants des parents, grands-parents, ...
                Set mesparents = xNode.ParentNode
     
                'tant qu'il existe un parent
                While Not (mesparents.ParentNode Is Nothing)
                       'je parcours les attributs de mon noeud pour chercher les valeurs de mon identifiant : id = "blabla"
                        For Each nitem In mesparents.Attributes
                            If nitem.Name = "id" Then
                                identifiant = nitem.Value
     
                            End If
                        Next
                   'je remonte à la génération précédente
                    Set mesparents = mesparents.ParentNode
     
                Wend
     
     
            End If
     
     
            'on passe au noeud suivant
     
            Call parcourir_noeuds(xNode)
        Next
     
     
    End Sub
    Après plusieurs tests, ce code marche mais... je me méfie. Es-ce à ça que tu pensais, est-ce que c'est trop lourd ?
    Merci

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

Discussions similaires

  1. [VBA-E]Classe d'export xml
    Par padre03 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/04/2006, 23h28
  2. [VBA-E] Bibliothèques pour Date/Time et String
    Par skual dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/03/2006, 16h17
  3. [VBA-E]classeur et gestion de feuilles
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/01/2006, 14h08
  4. [VBA-E] Pb sur gestion des erreurs
    Par micoscas dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 08/03/2005, 17h08
  5. Gestion XML
    Par kribot dans le forum Langage
    Réponses: 3
    Dernier message: 20/06/2004, 20h16

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