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

XML Discussion :

Charger un fichier XML avec MSXML


Sujet :

XML

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Charger un fichier XML avec MSXML
    Je souhaiterai charger un document XML existant sous Visual en C++.

    Voici un extrait de mon 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
     
     
    IXMLDOMDocumentPtr pXMLDoc;
    IXMLDOMParseError * errorObj;
    VARIANT_BOOL * isSuccessful = NULL;
     
    VARIANT varbstrXML;
    varbstrXML.bstrVal = _bstr_t(".../...");
     
    hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void **)&pXMLDoc);
     
    pXMLDoc->get_parseError(&errorObj);
     
     
    hr = pXMLDoc->load(varbstrXML, isSuccessful);
     
    pXMLDoc->get_parseError(&errorObj);
    Je recupère comme message d'erreur avec errorObj: _CrtDbgReport: String too long or IO Error

    La fonction CoCreateInstance retourne : S_OK.
    La fonction load retourne : E_INVALIDARG.


    Je ne vois pas l'erreur. Est-ce comme cela que l'on doit procéder ?

    Merci pour votre aide.


  2. #2
    Membre régulier Avatar de dockurt2k
    Inscrit en
    Juillet 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2006
    Messages : 91
    Points : 98
    Points
    98
    Par défaut Les joies du COM
    Ton probléme est sans doute dut au chemin que tu donne à charger.
    Il faut donner un nom (et éventuellement chemin) de fichier xml à la fonction load.

    bref essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varbstrXML.bstrVal = _bstr_t("c:/test.xml");
    en t'assurant que ce fichier existe.

    Au fait petit conseil qui ne vaut peut être pas grand chose. Essaye de te servir de servir des types plus haut niveau (smart pointers et données ac allocation/desallocation automatique), comme les _variant_t au lieu de VARIANT _bstr_t au lieu de BSTR. Tout ca est définie dans comutil.h.
    De plus pour effectuer ton CoCreateInstance tu peut te servir de l'acquisition automatique d'interface des pointeurs intelligents (Suffixe Ptr):
    PAr exemple ton initialisation pourrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MSXML2::IXMLDOMDocumentPtr docPtr;
    result =docPtr.CreateInstance(_T("Msxml2.DOMDocument.4.0"));
    qui me parait beaucoup plus pratique que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void **)&pXMLDoc);
    Pour avoir accés au pointeurs intelligents il te suffit de ne pas ajouter l'attribut no_smart_pointers à ta directive #import. Enfin du moins sur VC++ 2003 et 2005 (pas essayer avans).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Salut ,
    Je te conseil d'utiliser TinyXML, qui est je pense, le parser XML le plus facile d'utilisation que j'ai trouvé .

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Pour le load, j'ai trouvé le problème , j'ai modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    VARIANT_BOOL  isSuccessful = NULL;
    hr = pXMLDoc->load(varbstrXML, &isSuccessful);
    J'utilise maintenant le CreateInstance, c'est plus pratique.

    J'utilise _variant_t au lieu de VARIANT et _bstr_t au lieu de BSTR. C'est plus simple, avec allocation/desallocation automatique.

    Mais pour le load, l'utilisation de _variant_t ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    _variant_t varbstrXML;
    varbstrXML.vt = VT_BSTR;
    varbstrXML.bstrVal = _T("E:\\Dev\\VC2005\\ATL_XML\\books.xml");
     
    hr = pXMLDoc->load(varbstrXML.GetVARIANT(), &isSuccessful);
    Est ce bien comme ça ?

    Merci.

  5. #5
    Membre régulier Avatar de dockurt2k
    Inscrit en
    Juillet 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2006
    Messages : 91
    Points : 98
    Points
    98
    Par défaut
    _variant_t varbstrXML;
    varbstrXML.vt = VT_BSTR;
    varbstrXML.bstrVal = _T("E:\\Dev\\VC2005\\ATL_XML\\books.xml");

    hr = pXMLDoc->load(varbstrXML.GetVARIANT(), &isSuccessful);

    Apparement tu n'as pas accés aux encapsulations de msxml. Comment importe tu msxml (la ligne compléte #import "msxm.. dans ton stdafx.h sans doute) ?
    sinon tu pourrais utiliser un prototype de load du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VARIANT_BOOL IXMLDomDocument::load(_variant_t)
    Bref la je ne comprend pas pourquoi ca ne marche pas. Déja tu peut essayer de laisser le _variant_t déterminer son type tout seul comme un grand:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _variant_t varbstrXML = "E\\Dev\\.....
    Quel est l'erreur exactement? il refuse toujours de charger et de renvoie VARIANT_FALSE ?

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup cela marche avec :

    _variant_t varbstrXML = "E\\Dev\\.....



  7. #7
    Membre régulier Avatar de dockurt2k
    Inscrit en
    Juillet 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2006
    Messages : 91
    Points : 98
    Points
    98
    Par défaut
    Tu peut peut être noter la discussion comme [resolue] ?
    Enfin je suis nouveau et pas encore trop au courant des régles sur ce forum.

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

Discussions similaires

  1. Charger un fichier xml avec accent ?
    Par jbjean dans le forum C#
    Réponses: 2
    Dernier message: 10/04/2012, 18h19
  2. Charger un fichier XML avec TXMLDocument
    Par Amroth dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/04/2009, 11h35
  3. charger fichier xml avec du javascript
    Par bilel06 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/03/2008, 15h54
  4. Réponses: 9
    Dernier message: 26/07/2006, 16h22

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