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

Delphi Discussion :

Lire fichier XML


Sujet :

Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut Lire fichier XML
    j'ai écrit ce code là..
    je n'arrive pas à accéder à aucun noeud de mon fichier XML, pourtant j'utilise un composant XMLDoc qui est apparemment un des meilleurs sur le marché!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    begin
      nameXML := 'C:\test.xml';
      objXML := TXMLDocument.Create(nil);
      try
        objXML.LoadFromFile(nameXML);
        objXML.Active;
        try
        Noeud := ObjXML.DocumentElement.ChildNodes.First;
        except
        on e : Exception do
        ShowMessage(e.Message);
     
        end;
    est ce qu'il y a un ordre particulier à suivre??
    ya pas d'erreurs de compilation dans le code, mais j'ai une exception : opération de variant incorrecte au niveau de la ligne qui suit le try..

    Merci de m'éclairer SVP

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Ca focntionnera mieux comme çà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    begin
      nameXML := 'C:\test.xml';
      objXML := TXMLDocument.Create(nil);
      try
        objXML.FileName := nameXML;
        objXML.Active;
        try
        Noeud := ObjXML.DocumentElement.ChildNodes.First;
        except
        on e : Exception do
        ShowMessage(e.Message);
    
        end;
    Sinon regarde la :
    http://www.developpez.net/forums/sho...d.php?t=213059

    j'ai mis un code pour rechercher un noeud par son nom.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    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
     
    procedure TFormFicheMembre.Button2Click(Sender: TObject);
    var
      Noeud : IXmlNode;
      XmlDoc : TXMLDocument;
      nameXML : string;
     
    begin
        nameXML := 'C:\test.xml';
        XmlDoc := TXMLDocument.Create(nil);
        XMLDoc.Active := False;
        XMLDoc.FileName := nameXML; 
        XMLDoc.Active := True;
        Noeud := GetNode(XmlDoc.DocumentElement,'Memo');
     
      if Assigned(Noeud) then
        Showmessage('La valeur de ' + Noeud.NodeName + ' est de : ' + Noeud.Text);
    end;
    ça ne marche toujours pas...

    le XmlDOc.. c quoi?? c un TXMLDocument?? un IXMLDocument??? il lui faut un create ou pas??
    ça me renvoie toujours la même exception..

    Merci

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    c là que ça provoque l'exception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlDoc.DocumentElement;
    --> opération de pointeur incorrecte

    comment je fais l'appel alors??

    comment j'accède au noeud??

    en gros, comment je peux lui dire: je veux le noeud qui porte le nom X du fichier Y (surtout que ta fonction getNode demande un IXMLNode en paramètre!!)


    Merci

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Essai en posant le composant sur la fiche, sans faire de création dynamique.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Salut!

    Dans l'aide de mon Delhpi 7 (désolé c'est en anglais) :

    When TXMLDocument is created without an Owner, it behaves like an interfaced object. That is, when all references to its interface are released, the TXMLDocument instance is automatically freed. When TXMLDocument is created with an Owner, however, it behaves like any other component, and is freed by its Owner. When you add a TXMLDocument component from the component palette to a form or data module, it is automatically created with an Owner. When the TXMLDocument component is created using the global LoadXMLDocument function (or by a function that the XML Data Binding wizard generates to return the root node of the document), the function creates a TXMLDocument instance without an Owner.
    En gros ça dit que TXMLDocument.Create ne retourne pas un TXMLDocument quand on ne spécifie pas de propriétaire mais un IXMLDocument . Aussi, si tu passes nil en paramêtre, je crois que tu dois initialiser la propriété DOMVendor (à vérifier).

    Bon dev!

  7. #7
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par Malatar
    Essai en posant le composant sur la fiche, sans faire de création dynamique.
    En posant le composant sur la fiche, ça devrait marcher (puisque le propriétaire sera initialisé). Si tu veux continuer à créer l'objet dynamiquement, la référence sur l'objet sera une interface de type IXMLDocument et non un objet de type TXMLDocument.

  8. #8
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Salut, il faut toujours mettre un objet en paramètre du Create, sinon ça bugue, on ne peut pas mettre nil.

    Ensuite, il faut renseiger le DOMVendor, voici comment je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Result := TXMLDocument.Create( Application );
      Result.DOMVendor := GetDOMVendor( 'MSXML' );
      Result.Active := True;
    Result étant un TXMLDocument.

  9. #9
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par WebPac
    Salut, il faut toujours mettre un objet en paramètre du Create, sinon ça bugue, on ne peut pas mettre nil.
    Désolé de te contredire mais chez moi ça fonctionne très bien . Il suffit de savoir comment fonctionnent les objets COM (CoInitialize, IXMLDocument, DOMVendor, etc.).

  10. #10
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Je viens de tester ceci avec succès :

    Fichier XML ("C:\test.xml"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <TEST>
      <MEMO>Salut</MEMO> 
    </TEST>

    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
    var
      Noeud : IXmlNode;
      XmlDoc : IXMLDocument;
      nameXML : string;
     
    begin
        nameXML := 'C:\test.xml';
        XmlDoc := TXMLDocument.Create(nil);
        XMLDoc.FileName := nameXML;
        XMLDoc.Active := True;
     
        Noeud := XMLDoc.DocumentElement.ChildNodes.FindNode('MEMO');
     
      if Assigned(Noeud) then
        Showmessage('La valeur de ' + Noeud.NodeName + ' est de : ' + Noeud.Text);
    end;

  11. #11
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Citation Envoyé par slimjoe
    Désolé de te contredire mais chez moi ça fonctionne très bien . Il suffit de savoir comment fonctionnent les objets COM (CoInitialize, IXMLDocument, DOMVendor, etc.).
    http://www.developpez.net/forums/sho...ocument+Create

  12. #12
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Salut!

    Je viens de lire le post et le code ne fonctionne pas justement parce que tu travailles avec un TXMLDocument et non un IXMLDocument. Change la variable pour un IXMLDocument et tu vas voir ça fonctionne très bien (faut aussi enlever la ligne du DOMVendor qui appartient à TXMLDocument).


  13. #13
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Citation Envoyé par slimjoe
    Salut!

    Je viens de lire le post et le code ne fonctionne pas justement parce que tu travailles avec un TXMLDocument et non un IXMLDocument. Change la variable pour un IXMLDocument et tu vas voir ça fonctionne très bien (faut aussi enlever la ligne du DOMVendor qui appartient à TXMLDocument).

    Je suis content de l'apprendre 1 an et demi après.
    Quand j'aurai le courage, je le changerai dans les sources.
    Est-ce que ça change niveau performances ? Parce que pour l'instant, c'est pas très rapide.

    PS : désolé freestyler, je n'avais pas prévu de polluer ton topic.

  14. #14
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par WebPac
    Est-ce que ça change niveau performances ? Parce que pour l'instant, c'est pas très rapide.
    Je ne connais pas les documents XML assez pour répondre à cette question. J'ai appris à travailler avec les IXMLDocument il y a quelques mois seulement et je n'ai jamais utilisé le composant directement. Mais j'imagine que si on utilise directement l'objet COM sans passer par la VCL ça doit être plus rapide. De là à ce que ça soit significatif est une autre histoire

  15. #15
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    merci les gars..
    c t effectivemon une histoire de IXML vs TXML ...

    j'ai testé.. ça marche super bien!

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

Discussions similaires

  1. [AJAX] Lire fichier XML
    Par Maryy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/08/2007, 22h49
  2. lire fichier xml
    Par Alex35 dans le forum ASP
    Réponses: 5
    Dernier message: 14/02/2007, 12h13
  3. [XSLT] lire fichier XML
    Par julien14 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 07/07/2006, 12h16
  4. [SimpleXML] lire fichier xml
    Par ecoinfo dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/07/2006, 20h22
  5. Lire fichier XML en java
    Par loop4 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 17/05/2006, 16h46

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