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 :

Extraire des données dans XML en ciblant des ID?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 93
    Par défaut Extraire des données dans XML en ciblant des ID?
    Hello tout le monde!

    Patrick m'avait enseigné comment extraire une donnée dans un code source html avec l'aide du fameux "Split(Split(Code, "<donnee>")(1), "</donnee>")(0)"

    Maintenant mon problème a changé car je génère un code source XML avec plusieurs dizaines de données à récupérer selon une ID Le contenu du XML ressemble à cela:

    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
    - <references>
      - <reference>
             <referenceid>ID placé dans une cellule EXCEL</referencetid>
      - <headline>
              <![CDATA[donnéeX]]>
        </headline>
      - <caption>
             <![CDATA[donneeY]]>
        </caption>
      - <topic>
             <![CDATA[donneeZ]]>
        </topic>
      - <nombre>
             <total>2</total>
             <A>0</A>
             <B>1</B>
             <C>1</C>
        </nombre>
      - <donnees>
            - <global>
               - <donnee1>
                    <amount>donné souhaitait</amount>
                    <amount2>XERO</amount2>
                 </donnee1>
               - <donnee2>
                    <amount>donnés souhaitait</amount>
                    <amount2>XERO</amount2>
                 </donnee2>
                 <type>PLUS</type>
             </global>
           - <B>
                - <donnee1>
                    <amount>443644</amount>
                    <amount2>XERO</amount2>
                 </donnee1>
               - <donnee2>
                    <amount>124444</amount>
                    <amount2>XERO</amount2>
                 </donnee2>
                 <type>MOINS</type>
           - </B>
           - <C>
                - <donnee1>
                    <amount>5464534</amount>
                    <amount2>XERO</amount2>
                 </donnee1>
               - <donnee2>
                    <amount>3455433</amount>
                    <amount2>XERO</amount2>
                 </donnee2>
                 <type>PLUS</type>
           - </C>
      - </donnees>  
    - </references>
     
    '...plusieurs dizaines d'ID et de données

    Donc mon but serait de récupérer les données utiles dans " references/donnees/global" en dessous de chaque ID et de les rapatrier dans des cellules a côté de mes ID placées dans la colonne (A:A). A noter que l'ordre des ID dans le XML n'apparait pas dans l'ordre de mes ID sur la colonne.

    Voila un code "simplifié", c'est la seconde partie qui m'intéresse car elle n'est malheureusement qu'imaginaire :

    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
    'pas de problèmes pour la partie génération et extraction du code source xml
     
    listeID = concatener(A1:A50;""-"")
     
    url = "http://www.site.com" & listeID
     
    code = PostCodeSource (url)
     
     
    'Voilà ce que j'imaginerai, pour le ciblage et la sélection de mes données utiles pour chaque ID
     
    For Each C In ThisWorkbook.Worksheets("Feuill1").Range("A1:A50")
     
    Ciblage = FindID(Code) "<referenceid>(C)</referenceid>" 
     
    C.Offset(0, 1) = Ciblage(Split(Split(Code, "references/donnees/global/donnée1/amount")(1), "</amout>")(0)) 'inscrit la donnée utile qu'il y a en dessous de l'ID
    C.Offset(0, 2) = Ciblage(Split(Split(Code, "references/donnees/global/donnée2/amount")(1), "</amout>")(0)) 'inscrit la donnée utile qu'il y a en dessous de l'ID
     
    Next C
    Merci à tous !

  2. #2
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut
    Bonjour,

    Est ce que l’arborescence de ton fichier XML est fixe, ou alors le nombre de nœuds varie ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 93
    Par défaut
    Bonjour !

    Le nombre d'ID peut varier

    Le nombre de lignes qu'il y a entre <id>...</id> et <donnee>...</donnee> peut varier, de même que les lignes qui sont en dessous de la donnée et de la prochaine ID

    J'espère avoir répondu à la question

    Merci de t'intéresser à mon problème

  4. #4
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut
    Oui et non.

    En réalité, lorsque tu va parcourir un fichier XML en VBA, tu va te balader de nœuds en nœuds. Donc c'était de connaître le nombre de noeuds entre la base et les données.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <node1>
         <node2>
              <node3/>
         </node2
    </node1>

    ici ton arborescence fait 3noeuds. C'est ce que je voulais savoir. Si l'arborescence est fixe, ou si l'arborescence varie d'un ID à l'autre.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 93
    Par défaut


    Je comprends mieux ta question après avoir recopier le XML, j'ai changé mon premier message

    Donc pour être plus précis, je veux les données 1 et 2 qu'il y a entre les amount dans references/donnees/global et pour répondre (peut être) à ta question, je pense qu'il varie car quand <nombre><A></A> est à zéro, il n’y a pas <A></A> entre <donnees></donnees>

    Merci

    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
    - <references>
      - <reference>
             <referenceid>ID placé dans une cellule EXCEL</referencetid>
      - <headline>
              <![CDATA[donnéeX]]>
        </headline>
      - <caption>
             <![CDATA[donneeY]]>
        </caption>
      - <topic>
             <![CDATA[donneeZ]]>
        </topic>
      - <nombre>
             <total>2</total>
             <A>0</A>
             <B>1</B>
             <C>1</C>
        </nombre>
      - <donnees>
            - <global>
               - <donnee1>
                    <amount>donné souhaitait</amount>
                    <amount2>XERO</amount2>
                 </donnee1>
               - <donnee2>
                    <amount>donnés souhaitait</amount>
                    <amount2>XERO</amount2>
                 </donnee2>
                 <type>PLUS</type>
             </global>
           - <B>
                - <donnee1>
                    <amount>443644</amount>
                    <amount2>XERO</amount2>
                 </donnee1>
               - <donnee2>
                    <amount>124444</amount>
                    <amount2>XERO</amount2>
                 </donnee2>
                 <type>MOINS</type>
           - </B>
           - <C>
                - <donnee1>
                    <amount>5464534</amount>
                    <amount2>XERO</amount2>
                 </donnee1>
               - <donnee2>
                    <amount>3455433</amount>
                    <amount2>XERO</amount2>
                 </donnee2>
                 <type>PLUS</type>
           - </C>
      - </donnees>  
    - </references>

  6. #6
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut
    Bonjour,

    J'ai encore un peu de mal à saisir ce que tu veux récupérer, parceque je vois des données écris un peu partout

    je vais te donner quelques billes pour lire/écrire du XML dans ce cas. Nécessite la référence
    Nom : Capture.PNG
Affichages : 319
Taille : 35,2 Ko

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <nodeX>
         <node2>
              <nodeA/>
         </node2>
         <node3>
              <nodeB/>
         </node3>
    </nodeX>
    <nodeY>
         <node4>
              <nodeC/>
         </node4
    </nodeY>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim oXML As MSXML2.DOMDocument
    Dim oNode As MSXML2.IXMLDOMNode
    Dim oSubNode As MSXML2.IXMLDOMNode
     
    Set oXML = New MSXML2.DOMDocument
    oXML.async = False
    oXML.Load "path/file.xml"
    Ici, tu ouvre ton document XML (sans surprise, j'imagine)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each oNode In oXML.DocumentElement.ChildNodes
    Avec ça tu peux parcourir les noeuds liée à la racine. Dans ton exemple, il n'y a que "Référence". Dans mon exemple, je vais parcourir le noeuds X et le noeuds Y.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each oSubNode In oNode.ChildNodes
    Ici, je parcours tous les sous noeuds du noeuds oNode. donc les noeuds 2, 3 et 4.

    Je peux spécifier un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each oNode In oXML.DocumentElement.ChildNodes
         If oNode.BaseName = "nodeX" then
              For Each oSubNode In oNode.ChildNodes
    La je verrais que les noeuds 2 et 3.

    Après je suis désolé, mais mes connaissances en XML/VBA sont assez limités

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/08/2014, 08h48
  2. [SAX] Parser un fichier XML et exraire des données dans un matrice ou liste en JAVA
    Par chcheibani dans le forum Format d'échange (XML, JSON...)
    Réponses: 12
    Dernier message: 21/03/2014, 15h26
  3. Réponses: 2
    Dernier message: 31/05/2013, 12h48
  4. Réponses: 2
    Dernier message: 10/12/2011, 18h40
  5. Insertion des images dans la bases et des données
    Par painouch21 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/04/2009, 17h26

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