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

VBA Access Discussion :

Convertir un fichier xml en une table Access


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 232
    Par défaut Convertir un fichier xml en une table Access
    Bonsoir,
    je cherche à ouvrir les données ci-dessous (Le fichier complet fait ~700 ko.) dans une table Access autre qu'avec les commandes "données externes", "Importer".En fait j'aimerais automatiser cette tache (ex bouton click) en ouvrant une boite de dialogue, dans lequel on choisi le fichier xml, et on le converti en une table.
    Il y a après <IDENT> d'autres noeuds, mais qui ne me sont pas nécessaire seul le noeud ci dessous <IDENT> m'intéresse.
    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
    <LIM DATE="20080226">
    <MOTEUR>
    <INFO>
    <IDENT>
    	<SER>WM000147</SER>
    	<FAB>F0301</FAB>
    	<ART>307-797-004-0</ART>
    	<NNO>2840145364484</NNO>
    	<DENOFR>MOTEUR ASSEMBLE</DENOFR>
    	<DENOGB>TURBOJET ENGINE</DENOGB>
    	<VERSION>A02</VERSION>
    	<DATLIV>20060331</DATLIV>
    	<DATMS>19000101</DATMS>
    	<SEREQ>0</SEREQ>
    	<CTRIND>PHILIPPE FRIC</CTRIND>
    	<CTRCLI>BAR FREDERIC</CTRCLI>
    	<MARCHE>99-92049</MARCHE>
    	<DATMARCH>19991124</DATMARCH>
    	<CSN>72000001 000</CSN>
    	<ISN>00C</ISN>
    	<VERLMI>0065A</VERLMI>
    J'ai la fonction qui permet l'ouverture de la boite de dialogue et la sélection du fichier (cela fonctionne correctement) code ci dessous.
    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
    Dim i As Long
    Dim caract As String * 1
    Dim filebox As OPENFILENAME
    Dim fname As String
    Dim result As Long
    With filebox
            .lStructSize = Len(filebox)
            .hInstance = 0
            .lpstrFilter = "fichier (*.XML)" & vbNullChar & "*.xml" & vbNullChar
            .nMaxCustomFilter = 0
            .nFilterIndex = 1
            .lpstrFile = Space(256) & vbNullChar
            .nMaxFile = Len(.lpstrFile)
            .lpstrFileTitle = Space(256) & vbNullChar
            .nMaxFileTitle = Len(.lpstrFileTitle)
            .lpstrInitialDir = "A:\" & vbNullChar
            .lpstrTitle = "Selectionner le fichier à visualiser" & vbNullChar
            .flags = OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY
            .nFileOffset = 0
            .nFileExtension = 0
            .lCustData = 0
            .lpfnHook = 0
    End With
    result = GetOpenFileName(filebox)
    If result <> "" Then
            msgbox "Pas de fichier sélectionner"
    End If
     
    ?
     
    End Sub
    Mon souci, quoi mettre entre End If et End Sub pour ouvrir un xml

    Une aide serait la bienvenue
    Merci par avance

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    salut nomade333,

    je suppose que tu veux récupérer tous les noeuds <IDENT> de ton fichier qui représente un enregistrement de la table.

    pour être plus sur de ne pas répondre à côté:
    .la liste des champs de la table est elle exhaustive (fixe)?
    .les champs correspond t-elles aux noms des balises? (ou as tu déjà des noms prédéfinis)
    .un fichier xml=1 table ou import d'un xml dans une unique table?

    te serais-t-il possible de mettre l'archive zippé du xml pour ne pas avoir de mauvaise surprise?

    merci.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 232
    Par défaut
    Bonjour et merci,
    1) Oui, recupérer tous les noeuds IDENT
    2) Les champs de la table sont fixes
    3) Oui les champs de la table correspondent aux noms des balises
    4) Import du xml dans une table unique
    Ci joint fichier xml zippé
    Merci
    Cordialement

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 83
    Par défaut
    Bonjour,

    Il vous faut utiliser la référence XML dans access pour pouvoir lire votre fichier XML.

    voir tuto : http://khany.developpez.com/tutoriel/xml/

    Exemple de 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
     
    Public Sub ImportXML()
     
        Dim doc As MSXML2.DOMDocument
        Dim parent As MSXML2.IXMLDOMElement
        Dim fils As MSXML2.IXMLDOMNode
     
        Dim dt As DAO.Recordset
     
        Set dt = CurrentDb.OpenRecordset("table1")
        Set doc = New MSXML2.DOMDocument
     
        doc.async = False
        doc.Load (emplacement et nom du fichier XML)
        ' Recherche des noeuds IDENT
        For Each parent In doc.getElementsByTagName("IDENT")
            dt.AddNew
            ' parcourir noeud fils du parent
            For Each fils In parent.childNodes
                ' attribut = nom du champs
                dt.Fields(fils.nodeName) = fils.Text
            Next
            dt.Update
        Next
     
        Set doc = Nothing
        dt.close
        Set dt = nothing
     
    End Sub

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    salut nomade333,

    il faut que tu crées une table [tmpImport] avec comme nom de champs ceux de tes balises (très important) avec le type texte.

    tu appelles la procédure d'importation importerXml() qui à comme paramètre le chemin et nom du fichier xml.
    dont voici le 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
    Option Compare Database
    Option Explicit
     
    Sub importerXml(fichier As String)
    Dim oXmldoc, ident, balise, champ As Object
    Dim oRs As DAO.Recordset
     
    'vider la table
    CurrentDb.Execute "delete from tmpImport", dbFailOnError
     
    Set oXmldoc = CreateObject("Microsoft.XMLDOM")
     
    oXmldoc.Async = False
    oXmldoc.Load (fichier)
     
    Set oRs = CurrentDb.OpenRecordset("tmpImport", dbOpenTable)
     
    For Each ident In oXmldoc.selectNodes("//IDENT")
        oRs.AddNew
        For Each champ In oRs.Fields
            Set balise = ident.selectSingleNode("./" + champ.Name)
            If Not balise Is Nothing Then
                oRs(champ.Name) = balise.Text
            End If
        Next champ
        oRs.Update
    Next ident
     
    oRs.Close
    Set oXmldoc = Nothing
    End Sub
    tu noteras qu'il y a suppression des enregistrements de la table en début d'import que tu peux retirer et que cela ne gère pas le typage des valeurs: tous est du texte, mais si besoin je te laisse faire l'adaptation puisque ce n'est pas l'objectif du sujet de la discution.


  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 83
    Par défaut
    A l'attention de Vodiem

    Attention, votre code comporte quelques faiblesses a la fois de programmation et de raisonnement

    Programmation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim oXmldoc, ident, balise, champ As Object
    non typage et erreur sur déclaration de variable
    oxmldoc,ident et balise sont ici considérés comme des VARIANT.

    IL FAUT TOUJOURS TYPER LES VARIABLES
    à la fois pour des raisons de performance, mais aussi de lisibilité de code.


    Raisonnement :

    Vous parcourez les noeuds peres, puis parcourez les champs de votre table
    afin de retrouver les noeuds fils du fichier XML.
    Sachant qu'un fichier XML sera lu de façon sequentiel, il aurait été logique
    de parcourir les noeuds peres, ensuite les noeuds fils au lieu d'utiliser
    la méthode "SelectsingleNode" qui oblige à reparcourir votre fichier XML.

    D'autant plus,qu'un fichier XML etant sensible à la casse, si le nom du champs
    de votre table est en minuscule et l'attribut du fichier XML en majuscule,
    vous n'allez pas retrouver vos données.

    En conclusion, je dirais que votre titre de membre "expert" devrait vous
    obliger à revoir votre façon de programmer afin de rendre votre code
    beaucoup plus solide et optimisé qu'il ne l'est actuellement.

  7. #7
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    nostradamus>
    je n'ai pas mis mon code ni pour te faire plaisir ni pour te faire du tord.
    tu as posté ton code entre temps sans que je m'en rende compte.

    je ne suis pas ignorant de certain principe de "bonne" programmation et je ne pense pas avoir donc à me justifier de mes choix.
    mais si tu y tiens:

    j'ai préféré utiliser:
    CreateObject("Microsoft.XMLDOM") au lieu de l'objet DOMDocument60 avec ses IXMLDOMNode, IXMLDOMNodeList, d'après le code de philben (enfin il reste pas grand chose du code originel, deux-trois lignes)
    j'ai donc choisi la solution de facilité de déclarer en objet pour ne pas avoir à rechercher le typage approprié n'ayant les référencements (cela m'aurait surement obligé de rajouter une référence: ce que je veux éviter).
    Citation Envoyé par nostradamus
    IL FAUT TOUJOURS TYPER LES VARIABLES
    je me permet de te contredire: il est recommandé.
    c'est justement un avantage du VB par rapport à d'autre language, alors profitons en à bon escient.

    ta raison de performance ne se justifie pas dans ce code (et rarement dans access en général qui n'est pas vraiment adapter pour cela).
    lisibilité? tu ne vas pas me dire que tu te perds en variable dans un bloc de code comme celui-ci. il ne s'agit pas d'autant plus de variables globales.
    sincèrement, je pensais même pas les déclarer mais ayant utilisé différentes variables je voulais être sur de ne pas avoir oublié une en route j'ai donc déclaré explicit et j'ai finalement laissé mes déclarations.

    si j'ai priviligié ce code c'est pour ces trois avantages:
    .ne pas avoir à rajouter la référence "Microsoft XML, v6.0"
    .éviter les problèmes de namespace depuis XML v4 car tant qu'à utiliser cet objet autant utiliser la plus récente
    .ne pas me préoccuper de savoir s'il avait la référence XML v6

    pour le raisonnement:
    Citation Envoyé par nostradamus
    Sachant qu'un fichier XML sera lu de façon sequentiel, il aurait été logique
    de parcourir les noeuds peres, ensuite les noeuds fils au lieu d'utiliser
    la méthode "SelectsingleNode" qui oblige à reparcourir votre fichier XML.
    tu n'as pas lu correctement le code:
    . on ne parcours pas le fichier XML: c'est un objet DOM.
    . et tu te trompe: je parcours bien les noeuds pères, ensuite les noeuds fils:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ident.selectSingleNode("./"...
    c'est un adresse relative au noeud père, rien ne justifie qu'il n'y a parcours du noeud du dom pour cela (je doute que tu parcours les répertoires avec un "cd .\rep").

    Citation Envoyé par nostradamus
    D'autant plus,qu'un fichier XML etant sensible à la casse, si le nom du champs
    de votre table est en minuscule et l'attribut du fichier XML en majuscule,
    vous n'allez pas retrouver vos données.
    tu as raison de le préciser, je n'ai pas été suffisemment clair en écrivant:
    Citation Envoyé par vodiem
    comme nom de champs ceux de tes balises (très important)
    bon puisque tu te permet de critiquer mon code j'en aurais aussi à dire de ta solus (de bonne guerre tu me diras).
    tu ne donnes pas les références à ajouter: XML, mais aussi DAO (remarque que moi aussi )
    comment faire pour exploiter ton code: création de table table1 et type.
    tu ne précises pas les limites de ta solution entre autre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dt.Fields(fils.nodeName) = fils.Text
    erreur si la structure de l'XML change ou la balise n'est pas présente dans la table! (il y a des avantages comme des inconvénient à prendre à partir les noms des balises pour la table). c'est pour cela que je suis parti des noms des champs de la table, je trouve plus simple.

    tu aurais suivi le sujet tu s'aurait aussi que c'est la troisième discution qu'ouvre nomade333 qui si je n'avais insisté en MP pour faire profiter à tous d'une solution, avait abandonné car se trouve trop débutant.
    => c'est ceux en quoi je suis expert. lol
    le titre tu ne le choisi pas et je n'en tire aucune gloire, je ne suis pas là pour me mettre en valeur.

    mais au delà de ces querelles, je suis bien content que tu trouves matière à discution, ce qui est tout à ton honneur mais un brin d'ouverture permettrait une discution plus constructive.
    je ne pense pas que tu sois là pour remettre en cause ceux qui aident comme toi.

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

Discussions similaires

  1. [VB6]Importer un fichier texte dans une table ACCESS
    Par jean-pierre96 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/02/2013, 15h55
  2. remplissage d'un fichier excel avec une table access
    Par lupus83 dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/08/2007, 14h24
  3. [XSL] comment transformer ce fichier xml en une table html ?
    Par jlassira dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 15/03/2006, 12h15
  4. importer les noms de fichiers html dans une table access
    Par abane badis dans le forum Access
    Réponses: 3
    Dernier message: 14/11/2005, 17h25
  5. Réponses: 7
    Dernier message: 04/10/2005, 18h21

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