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 :

balise vide avec dom xml


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Points : 34
    Points
    34
    Par défaut balise vide avec dom xml
    Bonjour a tous j'ai un probleme avec mon parseur xml
    il fonctionne correctement sauf lorsque j'arrive à une balise vide il me créer un erreur car normalement je dois récuperer les infos se trouvant entre les balises dans un tableau de type string or arrivé à la balise ou il n'y a pas d'infos le tableau ne récupère rien il me créer object not set .
    j'ai essayé d'y remedié avec une condition si "" alors on fait cela mais rien a faire est-ce qu'il y aurait une methode pour régler ce pbm.
    Merci.

    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
     
     
    If Enfants_de_mv.nodeName = "moid" Then
     
    'ActiveSheet.Cells(intL, 3).Value = Enfants_de_mv.nodeTypedValue
     'intL = intL + 1
     
     ReDim Preserve tab_moid(1 To i_moid)
     
     
    ' *********cas ou on est dans les balise ou il n'y a pas de tetxe            
     
       If Enfants_de_mv.nodeTypedValue = "" Then
     
                    tab_moid(i_moid) = ""
                      i_moid = i_moid + 1
     
       End If
     '*****************************************                                                
     
     tab_moid(i_moid) = Enfants_de_mv.nodeTypedValue
     
       i_moid = i_moid + 1
     
       'End If
     
        End If
     
     
     
     
    intL = 7
     
                        For i_moid = LBound(tab_moid) To UBound(tab_moid)
                        ActiveSheet.Cells(intL, 3).Value = tab_moid(i_moid)
     
                        intL = intL + 1
     
                        Next i_moid
     
                        Erase tab_moid

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Points : 53
    Points
    53
    Par défaut
    Mmm personnellement j'utilise le DOM MS Xml 3.0. Principalement les objets document, élément et liste de noeud (DOMDocument, IXMDOMElement, IXMLDOMNodeList)

    La méthode getElementsByTagName("moid") de l'objet document renvoie une liste de noeuds itérable par For Each. Le "texte" d'un noeud est dans la propriété Text. Pour savoir si un élément a des fils, méthode HasChildNodes. Pour vérifier le type je me sers de la propiété BaseName de l'élément.

    Enfin, le DOM implémente les requête XPath qui sont bien pratiques.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    si j'ai bien compris je dois utiliser la méthode getelement by tag name
    et à quoi sert le Xpath car je suis débutant en la matière.
    Merci de ta réponse.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Points : 53
    Points
    53
    Par défaut
    XPath permet d'écrire des requêtes pour parcourir un document XML. C'est un langage avec une syntaxe pas compliquée, plus d'infos là :
    http://www.dil.univ-mrs.fr/~massat/ens/xml/4-xpath.html

    Petit guide très bien fait.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    Salut Laestic j'ai lu la doc sur le xpath par contre je ne comprend pas comment le coder en vba excel par rapport à mon code.

    Le probleme est que actuellement j'utilise un tableau pour optimiser le temps de traitement seulement lorsque j'arrive à un noeud qui ne contientpas de texte mon tableau ne peut pas se remplir j'ai cherché partout mais je n'y arrive tj pas.


    est-ce qu'il saurait possible que j'arrive à remplir mon tableu de type string meme si une balise n'a pas de texte?????


  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    Je viens de revérifier mon doc xml au fait le pb n'est pas que la balise moid est vide mais plutot qu'il y en a pas.
    je te montre la structure du doc:


    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    <mi>
    <mts>20080528001500Z</mts>
    <gp>900</gp>
    <mt>pmBwErrBlocks</mt>
    <mt>pmBwLostCells</mt>
    <mt>pmBwMissinsCells</mt>
    <mt>pmFwErrBlocks</mt>
    <mt>pmFwLostCells</mt>
    <mt>pmFwMissinsCells</mt>
    <mt>pmLostBrCells</mt>
    <mt>pmLostFpmCells</mt>
    <mv>
    <moid>ManagedElement=1,TransportNetwork=1,Aal2PathVccTp=MOD1-22-1-Vp2-Vc342</moid>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    </mv>
    <mv>
    <moid>ManagedElement=1,TransportNetwork=1,Aal2PathVccTp=MOD1-22-1-Vp2-Vc340</moid>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    </mv>
    </mi>
    </md>
    <md>
    <neid>
    <neun></neun>
    <nedn>SubNetwork=ONRM_RootMo,MeContext=MGPO1</nedn>
    <nesw>CXP9012221/2_R2B02</nesw>
    </neid>
    <mi>
    <mts>20080528001500Z</mts>
    <gp>900</gp>
    <mt>pmBwErrBlocks</mt>
    <mt>pmBwLostCells</mt>
    <mt>pmBwMissinsCells</mt>
    <mt>pmFwErrBlocks</mt>
    <mt>pmFwLostCells</mt>
    <mt>pmFwMissinsCells</mt>
    <mt>pmLostBrCells</mt>
    <mt>pmLostFpmCells</mt>
    </mi>
    </md>
    <md>
    <neid>
    <neun></neun>
    <nedn>SubNetwork=ONRM_RootMo,MeContext=MGPO1</nedn>
    <nesw>CXP9012221/2_R2B02</nesw>
    </neid>
    <mi>
    <mts>20080528001500Z</mts>
    <gp>900</gp>
    <mt>pmBwErrBlocks</mt>
    <mt>pmBwLostCells</mt>
    <mt>pmBwMissinsCells</mt>
    <mt>pmFwErrBlocks</mt>
    <mt>pmFwLostCells</mt>
    <mt>pmFwMissinsCells</mt>
    <mt>pmLostBrCells</mt>
    <mt>pmLostFpmCells</mt>
    <mv>
    <moid>ManagedElement=1,TransportNetwork=1,Aal2PathVccTp=MOD2-22-1-Vp2-Vc342</moid>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    </mv>
    <mv>
    <moid>ManagedElement=1,TransportNetwork=1,Aal2PathVccTp=MOD2-22-1-Vp2-Vc340</moid>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>
    <r>0</r>

    1. donc du début du fichier jusqu'a la fin il y a bien des balises moid.
    2. a un certain moment je n'en est plus et c'est la que mon tableau bloque
    je pense qu'il ne peut pas inscrire de valeurs vu qu'il n'y a rien.

    3. j'ai encore une balise moid mais je n'arrive pas a atteindre cette étape.

    3.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Points : 53
    Points
    53
    Par défaut
    Pour avoir tous les noeuds Moid et récupérer leur texte :

    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
    Option Base 0
     
    Dim monXml As New DOMDocument
    Dim oListeNoeuds As iXMLDOMNodeList
    Dim oNdMoid As IXMLDOMElement
    Dim tabMoid() As String
     
    monXml.Load("mon chemin...")
     
    ' recherche des balises
    set oListeNoeuds = monXml.getElementsByTagName("moid")
    If oListeNoeuds.Length > 0
    	' dimensionnement du tableau
    	ReDim tabMoid(oListeNoeuds.Length)
    	iCpt = 0
    	' parcours de toutes les balises trouvées
    	For Each oNdMoid In oListeNoeuds
    		tabMoid(iCpt) = oNdMoid.Text
    		iCpt = iCpt + 1
    	Next
    Endif

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    merci pour ta réponse j'ai trouvé la solution a mon pb il falliat que je rajoute juste un else et puis je met la valeur vide si aucune balise moid est trouvée.

    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
    53
    54
    55
     
     
    For Each Enfants_de_mv In ListeEnfants_de_mv
                                                 intrr = 7
     
                                                If Enfants_de_mv.nodeName = "moid" Then
                                                'ActiveSheet.Cells(intL, 3).Value = Enfants_de_mv.nodeTypedValue
                                                 'intL = intL + 1
     
                                               ReDim Preserve tab_moid(1 To i_moid)
                                                tab_moid(i_moid) = Enfants_de_mv.nodeTypedValue
                                                i_moid = i_moid + 1
     
                                                End If
     
                                                '***********************modif******************
     
                                               If Enfants_de_mv.nodeName = "r" Then
     
                                                'ActiveSheet.Cells(intL -1, intR).Value = Enfants_de_mv.nodeTypedValue
                                                ActiveSheet.Cells(intrr, intR).Value = Enfants_de_mv.nodeTypedValue
                                                intR = intR + 1
     
                                                'ReDim Preserve tabvalue_r(1 To ivalue_r)
                                                'tabvalue_r(ivalue_r) = Enfants_de_mv.nodeTypedValue
                                                'ivalue_r = ivalue_r + 1
     
     
     
                                                End If
     
                                        '**************balise indiquant un fichier faux************
                                        If Enfants_de_mv.nodeName = "sf" Then
     
                                        ActiveSheet.Cells(intL - 1, 2).Value = Enfants_de_mv.nodeTypedValue
                                        Cells(intL - 1, 2).Font.ColorIndex = 3
                                        'Rows(intL).Interior.Color = 3
     
                                        End If
                                        '****************************************************************
     
                                                                    ActiveSheet.Columns.AutoFit
                                                                      Next Enfants_de_mv
     
                                        '**********on reset  intR sur la ligne du dessous***********
                                        'intR = 4
                                        '***************************************************************
                                Else
     
                                ReDim Preserve tab_moid(1 To i_moid)
                                tab_moid(i_moid) = "vide"
     
     
     
                                    End If

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

Discussions similaires

  1. forme des balises vides avec XmlSerializer.
    Par dev_zou dans le forum Accès aux données
    Réponses: 0
    Dernier message: 08/11/2014, 14h17
  2. [StAX] Ecriture d'une balise vide avec XMLEventWriter
    Par txomin.patalagoïty dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 14/05/2013, 22h59
  3. Recherche hébergeur avec DOM-XML, XML-RPC et XSLT
    Par messier79 dans le forum Gratuit
    Réponses: 1
    Dernier message: 27/08/2010, 19h58
  4. [DOM] Element vide avec DOM
    Par jad_jad dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 27/05/2008, 19h11
  5. [EasyPHP] Easy Php 2.0 : Problème avec Dom Xml
    Par devadh dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 26/01/2007, 16h26

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