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 :

[Delphi 6] XML - Plantage lors de l'appel à "ChildNodes.FindNode"


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 114
    Points : 133
    Points
    133
    Par défaut [Delphi 6] XML - Plantage lors de l'appel à "ChildNodes.FindNode"
    Hello,

    J'ai un crash sévère de mon appli au moment où je fais un "XMLDoc.DocumentElement.ChildNodes.FindNode('Nom');", et je ne comprends pas du tout d'où celà peut venir ?


    Ci-joint le code (simplifié pour le source principal)

    fichier test.xml

    <Root>
    <Nom>DUPONT</Nom>
    <Prenom>Robert</Prenom>
    </Root>

    Appli principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    .
    .
    uses xmlfunction;
    .
    .
    .
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       P_read_XML_file ('C:\_dev\xml\test.xml');
    end;
    Unité :
    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
    unit xmlfunction;
     
    interface
     
    uses xmldom, XMLIntf, msxmldom, XMLDoc,Dialogs, SysUtils;
     
    function P_read_XML_file (filename : string) : string;
     
    implementation
     
    function P_read_XML_file (filename : string) : string;
    var  XMLDoc: TXMLDocument;
         Node  : IXMLNode;
    begin
     
      try
        XMLDoc           := TXMLDocument.Create(nil);
        XMLDoc.DOMVendor := DOMVendors.Find ('MSXML') ;
        XMLDoc.Options   := [doNodeAutoIndent, doAttrNull];
        XMLDoc.Active    := true;
     
        If FileExists(filename) then
        begin
          XMLdoc.LoadFromFile(filename);
     
          ShowMessage('Jusqu''ici tout va bien');
     
          Node := XMLDoc.DocumentElement.ChildNodes.FindNode('Nom'); // PLANTAGE !
        end;
      finally
        XMLDoc.Free;
      end;
     
      Result := 'Fin_procedure';
    end;
     
    end.
    Oracle - Citrix CCA - Vmware

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essai ca :

    [QR] Comment récupérer un noeud par son nom ?

    La procédure ci-dessous permet de recupérer un noeud d'un document XML grâce à son nom

    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
     
    function GetNode(XmlNode : IXmlNode;NodeName : String) : IXmlNode;
    var
     i : integer;
    begin
      Result := nil;
     
    //Les noeuds internes sont traités récursivement
      if XMLNode.NodeType <> ntElement then
        Exit;
     
      //S'il s'agit d'une feuille
      if XMLNode.IsTextElement then
        if UpperCase(XmlNode.NodeName) = UpperCase(NodeName) then
        begin
          Result := XmlNode;
          Exit;
        end;
      // S'il s'agit d'un attribut
      for i := 0 to XMLNode.AttributeNodes.Count - 1 do
        if UpperCase(XMLNode.AttributeNodes.Nodes[I].NodeName) = Uppercase(NodeName) then
        begin
          Result := XMLNode.AttributeNodes.Nodes[I];
          Exit;
        end;
     
      // Si le noeud a des enfants on recherche dedans.
      if XMLNode.HasChildNodes then
        for I := 0 to XMLNode.ChildNodes.Count - 1 do
        begin
          Result := GetNode(XmlNode.ChildNodes.Nodes[I],NodeName);
          // si on a un resultat on quitte car c'est celui qu'on recherche
          if Result <> nil then
            Exit;
        end;
    end;
    Pour l'appel de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      Noeud : IXmlNode;
    begin
      Noeud := GetNode(XmlDoc,'MonNoeud');
      if Assigned(Noeud) then
        Showmessage(La valeur de ' + Noeud.NodeName + ' est de ' + Noeud.Text);
    end;
    Modérateur Delphi

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

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 114
    Points : 133
    Points
    133
    Par défaut
    Malheureusement le résultat est le même...crash de l'appli.

    En revanche il y a une petite erreur dans ton code. Quand tu appel la fonction GetNode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Noeud := GetNode(XmlDoc,'MonNoeud');
    XmlDoc est du type TXMLDocument alors que la fonction GetNode attends un IXMLNode.

    J'ai essayé XMLDoc.DocumentList à la place et meme un XMLDoc.DocumentList.ParentNode, mais rien n'y fait ?


    J'ai l'impression que mon objet XMLDoc est mal paramétré ? En effet, le même code utilisé directement dans l'application principale avec un composant XMLDocument déposé sur la fiche et renommé 'XMLDoc' fonctionne parfaitement !!!?
    Oracle - Citrix CCA - Vmware

  4. #4
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Salut,
    essaye peut être de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLDoc           := TXMLDocument.Create(nil);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLDoc           := TXMLDocument.Create(self);
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Je viens tout juste d'avoir un problème semblable qui a été réglé grâce à cet article :

    http://bdn.borland.com/article/0,1410,29241,00.html

    En gros, ça dit que TXMLDocument.Create ne retourne pas un objet TXMLDocument mais une interface IXMLDocument. J'ai du changer ça dans mon code pour que ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      //XMLDoc: TXMLDocument;  Ancienne déclaration
      XMLDoc: IXMLDocument; //Nouvelle déclaration
    -Slimjoe

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 114
    Points : 133
    Points
    133
    Par défaut
    Bien vu Slimjoe !

    En revanche, certaines méthodes/propriétés ne sont du coup plus accessibles. Ainsi, ma procédure deviendra :

    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
    function P_read_XML_file (filename : string) : string;
    var  XMLDoc: IXMLDocument;
         Node  : IXMLNode;
    begin
    
      try
        XMLDoc           := TXMLDocument.Create(nil); // 
         // XMLDoc.DOMVendor := DOMVendors.Find ('MSXML') ; // Non supporté supported
        XMLDoc.Options   := [doNodeAutoIndent, doAttrNull];
        XMLDoc.Active    := true;
    
        If FileExists(filename) then
        begin
          XMLdoc.LoadFromFile(filename);
    
          ShowMessage('Jusqu''ici tout va bien');
    
          Node := XMLDoc.DocumentElement.ChildNodes.FindNode('Nom'); // Plus de plantage :D
      end;
      finally
        // XMLDoc.Free; // Non supporté
      end;
    
      Result := 'Fin_procedure';
    end;
    Merci beaucoup !
    Oracle - Citrix CCA - Vmware

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2014, 09h53
  2. Plantage lors de l'appel d'une procédure stockée
    Par thor76160 dans le forum ASP.NET MVC
    Réponses: 7
    Dernier message: 27/12/2012, 16h32
  3. Réponses: 19
    Dernier message: 10/08/2012, 11h45
  4. Réponses: 1
    Dernier message: 25/06/2012, 17h52
  5. [DOM] Erreur I/O lors de l'appel const.parse(xml)
    Par BasileG dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 22/12/2010, 23h00

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