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 :

Import XML structure complexe


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 63
    Par défaut Import XML structure complexe
    Bonjour à tous,

    Voici mon prob, je dois importer des fichiers XML (qui ont le même structure) dans une base de donnée access, et sin possible dans une même table.

    J'ai trouvé ce bout de code sur le forum qui me permet d'importer un fichier XML "simple" dans une table access :

    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
    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("tmpimport")
        Set doc = New MSXML2.DOMDocument
     
        doc.async = False
        doc.Load ("p:\document\desktop\XML\test.xml")
        ' Recherche des noeuds IDENT
        For Each parent In doc.getElementsByTagName("commande")
            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
    Je dis simple car la structure du fichier est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <commandes>
     
    		<numCommande>1297</numCommande>
    		<numCompteClient>5.85595</numCompteClient>
    		<raisonSociale>SOCIETE FINANCIERE DE TERRASSEME</raisonSociale>
    		<SIREN>398172296</SIREN>
    </commandes>

    Mais dès que la structure est plus complexe, le code ne fonctionne plus, et je n'ai aucune idée de comment le modifier.

    Par exemple pour un fichier XML ayant 5 ou 6 enfants :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="20071214_commandeRetour_v1_0.xsl"?>
    <commandes>
    	<societes>
    		<societe>
    			<IdSociete erreur="">
    				<numCommande>1297</numCommande>
    				<numCompteClient>5.85595</numCompteClient>
    				<raisonSociale>SOCIETE FINANCIERE DE TERRASSEME</raisonSociale>
    				<SIREN>398172296</SIREN>
    			</IdSociete>
    			<sites>
    				<site erreur="">
    					<SIRET>39817229600020</SIRET>
    					<raisonSociale>SOCIETE FINANCIERE DE TERRASSEME</raisonSociale>
    						<siteGestFlotte erreur="">
    						<nom>RODRIGUEZ</nom>
    						<prenom>FOUZIA</prenom>
    						<mail>claude.remetter@sofiter.fr</mail>
    						<tel>0490474748</tel>
    						<mobile></mobile>
    						<fax>0490471736</fax>
    					</siteGestFlotte>
    					<infratel erreur="">
    						<PABX erreur="">
    							<marque></marque>
    							<model></model>
    						</PABX>
     
    				</site>
    			</sites>
     
    		</societe>
    	</societes>
    </commandes>
    Merci d'avance pour votre aide, j'espère avoir été assez précis.

  2. #2
    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,

    Sans plus de renseignements sur la structure de votre table et sur la structure
    du fichier XML, nous partirons sur les hypotheses suivantes:

    - Chaque noeud final du fichier XML correspond à un champs de votre table
    - Les noms des champs de la table correspondent aux noms des noeuds XML
    - Chaque balise "societe" du fichier XML correspond à un nouvel enregistrement.

    Vous pouvez partir sur la solution suivante : Parcours récursif du fichier XML
    à partir des balises "societe" rencontrées - on parcours le fichier XML de façon
    récursive tant que le noeud posséde des enfants.

    Ce qui pourrait se traduire par :

    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
    41
    42
    43
     
     
    Public Sub ImportXML()
     
        Dim doc As MSXML2.DOMDocument
        Dim parent As MSXML2.IXMLDOMNode
     
        Dim dt As DAO.Recordset
     
        Set dt = CurrentDb.OpenRecordset("table1")
        Set doc = New MSXML2.DOMDocument
     
        doc.async = False
        doc.Load ("c:\xml02.xml")
        ' Recherche des noeuds de tous les noeuds "societe"
        For Each parent In doc.getElementsByTagName("societe")
            dt.AddNew
            ' Noeud societe rencontre - recursivite sur ce noeud
            Call ParcourirXML(parent, dt)
            dt.Update
        Next
     
        Set doc = Nothing
        dt.Close
        Set dt = Nothing
     
    End Sub
     
    Public Sub ParcourirXML(ByRef pere As MSXML2.IXMLDOMNode, ByRef dt As Recordset)
     
        Dim fils As MSXML2.IXMLDOMNode
        If pere.hasChildNodes Then
            For Each fils In pere.childNodes
                Call ParcourirXML(fils, dt)
            Next
        Else
          ' Test si noeud est un noeud final 
            If pere.nodeType = NODE_TEXT Then
                ' on suppose que le nom du noeud correspond au nom du champs de la table
                dt.Fields(pere.parentNode.nodeName) = pere.Text
            End If
        End If
    End Sub
    Ceci est une solution possible,

    Cordialement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 63
    Par défaut
    Re,

    petit soucis avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call ParcourirXML(parent, dt)
    Erreur : Incompatibilité de Type.

    Il y a peut être un soucis avec le parametre parent et pere?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 63
    Par défaut
    en fait c'était le paramêtre Dt qui est du type DAO.Recordset

    Ton code fonctionne super!!!

    MAIS, maintenant j'ai un autre soucis, je m'explique :

    Jusqu'à maintenant je créais 1 ligne par client en remplissant tous les champs de la table.
    Mon problème est que j'ai maintenant des données multiples sur un même client : Par exemple avec le noeud <USER>

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="20071214_commandeRetour_v1_0.xsl"?>
    <commandes>
    	<societes>
    		<societe>
    			<IdSociete erreur="">
    				<numCommande>1297</numCommande>
    				<numCompteClient>5.85595</numCompteClient>
    				<raisonSociale>SOCIETE FINANCIERE DE TERRASSEME</raisonSociale>
    				<SIREN>398172296</SIREN>
    			</IdSociete>
    			<sites>
    				<site erreur="">
    					<SIRET>39817229600020</SIRET>
    					<raisonSociale>SOCIETE FINANCIERE DE TERRASSEME</raisonSociale>
    						<siteGestFlotte erreur="">
    						<nom>RODRIGUEZ</nom>
    						<prenom>FOUZIA</prenom>
    						<mail>claude.remetter@sofiter.fr</mail>
    						<tel>0490474748</tel>
    						<mobile></mobile>
    						<fax>0490471736</fax>
    						<USER>
    							<ID_USER>258741</ID_USER>
    							<Type>A</Type>
    							<.....>	</....>
    						</USER>
    						<USER>
    							<ID_USER>25584</ID_USER>
    							<Type>B</Type>
    							<.....>	</....>
    						</USER>
    						<USER>
    							<ID_USER>24563</ID_USER>
    							<Type>B</Type>
    							<.....>	</....>
    						</USER>
     
     
    					</siteGestFlotte>
    					<infratel erreur="">
    						<PABX erreur="">
    							<marque></marque>
    							<model></model>
    						</PABX>
     
    				</site>
    			</sites>
     
    		</societe>
    	</societes>
    </commandes>
    Comment créer une ligne différente pour chaque USER, tout en ayant les autres champs quand même remplis, juste les champs USER différents.

    Merci d'avance pour cette nouvelle question.

  5. #5
    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
    Difficile de te répondre sans connaitre exactement la structure de ton
    fichier XML ainsi que celle de tes tables, ainsi que la correspondance
    entre les différents noeuds et les différents champs de ta table.

    Tu souhaites créer un enregistrement par noeud USER avec les renseignements
    des noeuds parcourus avant ce noeuds USER, ou tu souhaite créer dans une autre
    table "USER" les sous-noeuds du noeud USER ???

    Par ailleurs, la solution, que je t'avais apporté, n'est certainement pas la
    plus optimale, ni forcément la plus générique. Elle te permettait juste d'avoir
    une idée de la façon de faire pour parcourir ton fichier XML de façon récursif,
    et de créer tes enregistrements.

    Cordialement

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 63
    Par défaut
    Bonjour,

    Je vais mettre mon fichier XML en ligne pour donner plus de détail,
    mais en gros c'est ce que tu disais,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    créer un enregistrement par noeud USER (ou plus bas) avec les renseignements
    des noeuds parcourus avant ce noeuds
    Je peux avoir X CLIENT avec X USER avec 1 Ligne Fixe ou Mobile avec X Services.
    Donc dans l'idéal il me faudrait 1 ligne par service différent mais en reprennant les noeuds précédents, C'est à dire, par exemple le compte client, son nom, prenom.......
    Je ne sais pas si cela est faisable....au vue de mon niveau de prog très bas!!!!

    XML ci-joint.

    Merci du temps que tu me consacres.

    Il serait peut être possible de partir du bas, c'est à dire du dernier noeud et de remonter, mais je ne trouve pas comment remplacer HasChildNodes, il n'y a pas de fonction equivalentes style HasPArentNodes :-))
    Je continue à chercher, mais je pense que si j'arrive à créer une ligne en remontant les noeud c'est gagné, enfin j'espère....
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2013, 00h42
  2. Font , Xml & structure de programme .
    Par Clad3 dans le forum XML
    Réponses: 11
    Dernier message: 30/03/2005, 22h45
  3. Importer la structure d'une table
    Par barthelv dans le forum Outils
    Réponses: 3
    Dernier message: 05/10/2004, 11h37
  4. [langage] structures complexes et affichage
    Par mat21 dans le forum Langage
    Réponses: 5
    Dernier message: 18/02/2004, 15h38
  5. Réponses: 4
    Dernier message: 17/02/2004, 08h36

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