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 :

Import XML : la variable DOM n'importe rien [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Par défaut Import XML : la variable DOM n'importe rien
    Bonjour,
    J'écris une macro qui charge un fichier XML avec la méthode DOM. Je me suis appuyé sur le tuto d'arkham (et grand merci au passage):
    https://arkham46.developpez.com/arti...b/?page=page_4

    J'ai activé la référence Microsoft XML, v6.0
    Et ... la variable ne charge pas le XML.
    Il n'y a pas de message d'erreur.
    L'objet DOMDocument60 est bien instancié mais reste une coquille vide.


    A quelques détails prêt (adaptation à Excel365), c'est la macro du tutoriel d'Arkham :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub ReadXMLFileXMLIndent()
        Dim oXML As msxml2.DOMDocument60, test As String
     
        Set oXML = New DOMDocument60
        oXML.async = False
        oXML.Load ("D:\test.svg")
        test = oXML.XML 'test est vide ...
    End Sub
    D'autant plus rageant que ça marche sans soucis avec CreateObject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         Dim fso As Object, f As Variant, fichier_entier as string, NomFichier  as string
           NomFichier = "D:\test.svg"
           Open NomFichier For Input As #1
           Set fso = CreateObject("Scripting.FileSystemObject")
           Set f = fso.OpenTextFile(NomFichier, 1)
           fichier_entier = f.ReadAll 'ça marche nickel
    Si quelqu'un peut donner une piste. J'ai certainement oublié un truc évident que je ne vois pas.
    Dernière précision, mon fichier test.svg est bien un fichier xml avec des balises, parfaitement conforme.

    Merci pour vos réponses

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Par défaut
    Après pas mal de tests, j'ai fini par comprendre. Je laisse donc quelques explications pour ceux qui tomberaient sur ce problème.
    La méthode .load ne comprend pas les instructions DOCTYPE en entête de certains fichiers XML, en l'occurrence dans mon cas, du .svg. Un peu gênant
    La cause est un problème de sécurité lié aux DTD
    Il faut donc au préalable isoler les instructions XML dans une variable string et l'appeler avec .loadXML (.load appelle directement le fichier)
    petit exemple dans mon cas :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->                               'ligne non interprétée par .load par défaut
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">       'ligne non interprétée par .load par défaut
    <svg version="1.1"
    	 id="svg4014" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"
    	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="4556px" height="3069px"
    	 viewBox="0 0 4556 3069" enable-background="new 0 0 4556 3069" xml:space="preserve">
    <g id="_x35_00_x3E__60">
    	<g id="Points_Topo">
    		<g id="Croix">
    			<g id="_x33_086">
    				<polyline id="polyline3878" fill="none" stroke="#000000" stroke-width="0.1" points="902.719,1869.312 904.199,1879.203 
    					903.459,1874.26 898.513,1874.998 908.404,1873.517 				"/>
    			</g>
    			<g id="_x33_087">
    				<polyline id="polyline3881" fill="none" stroke="#000000" stroke-width="0.1" points="878.99,1828.322 880.469,1838.215 
    					879.727,1833.267 874.782,1834.01 884.676,1832.527 				"/>
    			</g>
    			<g id="_x33_088">
    				<polyline id="polyline3884" fill="none" stroke="#000000" stroke-width="0.1" points="870.936,1788.685 872.416,1798.574 
    					871.677,1793.635 866.733,1794.369 876.621,1792.89 				"/>
    			</g>
    		</g>
    	</g>
    </g>
    </svg>

    code qui permet de contourner le problème :
    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
                           Dim xmlDoc  , fso As Object, f As Variant, NomFichier  as string, fichier_entier  as string
     
                           NomFichier = "D:\monfichier.svg"
                           'ouverture du fichier et enregistrement dans la variable fichier_entier
                            Open NomFichier For Input As #1
     
                               ' on enregistre le fichier dans une variable
                               Set fso = CreateObject("Scripting.FileSystemObject")
                               Set f = fso.OpenTextFile(NomFichier, 1)
                               fichier_entier = f.ReadAll
     
                                'on ne garde que le contenu de la balise <svg et se débarasser des  lignes d'entête
                               fichier_entier = Mid(fichier_entier, InStr(1, fichier_entier, "<svg"))
                               f.close
                            Set xmlDoc = CreateObject("Microsoft.XMLDOM")
     
                            xmlDoc.LoadXML (fichier_entier) ' et là on embraye sur les objets DOM
    EDIT : après recherche, il y a moyen de désactiver la mesure de sécurité qui bloque l'instruction load. Pour cela il faut rajouter une instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim toto as string
    toto = xmlDoc.SetProperty("ProhibitDTD", True)
    Merci en tous cas à ceux qui ont pris la peine de lire.

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

Discussions similaires

  1. [2012] bcp fonctionne mais n'importe rien
    Par Papy214 dans le forum Outils
    Réponses: 5
    Dernier message: 05/01/2016, 10h36
  2. [DOM XML] Migration script DOM vers DOMXML
    Par Fabouney dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 03/10/2006, 10h46
  3. [DOM XML] Comment utiliser DOM(XML)?
    Par hitman94 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 27/07/2006, 16h16
  4. [DOM XML] Utilisation de DOM/DomXML
    Par m@t dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 13/02/2006, 11h22
  5. XML et variable d'environnement
    Par nicolas.79 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/11/2005, 10h03

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