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

Composants VCL Delphi Discussion :

XMLDocument.LoadFromXML : Violation d'accès


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut XMLDocument.LoadFromXML : Violation d'accès
    Salut,
    J'essaie tant bien que mal de lire le retour XML d'une requête POST, mais je me ramasse une jolie erreur.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
        // ici pour le DEBUG, je copie le retour XML de la connexion dans une variable, car tout est OK de ce côté, et ça embrouillerait le code.
     
        Reponse := '<?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>';
     
        with TXMLDocument.Create(nil) do
        try
     
        LoadFromXML(Reponse);
        Active := True;
     
        XMLReponseString := ChildNodes.Nodes['mt'].ChildNodes.Nodes['return'].ChildNodes.Nodes['status'].Text;
     
        if(XMLReponseString = '0') then
        begin
          Result := False;
        end
        else
        begin
          Result := True;
        end;
     
        Active := False;
     
        finally
          Free;
        end;
    Le système m'envoie a la merde avec ceci:

    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet Encoder.exe a provoqué une classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse FFFF0000. Lecture de l'adresse FFFF0000'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    ---------------------------
    OK Aide
    ---------------------------

    Merci de votre aide

  2. #2
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Tu devrais tester à chaque étage que le noeud est bien retourné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    XNdoe : IXMLNode;
    ...
    XNode := ChildNodes.Nodes['mt']
    If XNode<>Nil then...
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Toujours une violation d'accès !!


    Erreur a la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (XMLNode1 <> nil) then
    Le 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
    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
       Reponse := '<?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>';
     
        with TXMLDocument.Create(nil) do
        try
     
          LoadFromXML(Reponse);
          Active := True;
     
          XMLNode1 := ChildNodes.Nodes['mt'];
     
          if (XMLNode1 <> nil) then
          begin
            ShowMessage('La node MT est vide.');
          end
          else
          begin
     
          XMLNode2 := XMLNode1.ChildNodes.Nodes['return'];
     
            if (XMLNode2 <> nil) then
            begin
              ShowMessage('La node Return est vide.');
            end
            else
            begin
              ShowMessage(XMLNode2.ChildNodes.Nodes['status'].Text);
            end;
     
          end;
     
          if (XMLReponseString = '0') then
          begin
            Result := False;
          end
          else
          begin
            Result := True;
          end;
     
          Active := False;
     
        finally
          Free;
        end;

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Bonjour, première remarque dans ton algorithme tu t'es trompé car tu dois tester XMLNode1 = NIL alors erreur au lieu de XMLNode1 <> NIL.

    Ensuite pour le premier noeud pourquoi ne tenterait-tu pas de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLNode1 := DocumentElement;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    encore et toujours violation d'accès alors que les erreurs doivent être gerées à présent ...

    et le mieux c'est qu'a présent l'IDE ne me dit même pas ou il bloque.

    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
     
        Reponse := '<?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>';
     
        with TXMLDocument.Create(nil) do
        try
          //XML :=Reponse; // MARCHE PAS ?
          LoadFromXML(Reponse);
          Active := True;
     
          XMLNode1 := DocumentElement;
     
          if (XMLNode1 = nil) then
          begin
            ShowMessage('La node MT est vide.');
          end
          else
          begin
     
          XMLNode2 := XMLNode1.ChildNodes.Nodes[0];
     
            if (XMLNode2 = nil) then
            begin
              ShowMessage('La node Return est vide.');
            end
            else
            begin
              ShowMessage(XMLNode2.ChildNodes.Nodes['status'].Text);
            end;
     
          end;
     
          if (XMLReponseString = '0') then
          begin
            Result := False;
          end
          else
          begin
            Result := True;
          end;
     
          Active := False;
     
        finally
          Free;
        end;

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Est-ce que vous effectuez une lecture asynchrone (poAsyncLoad dans la propriété ParseOptions) ?

    Par ailleurs il y a un truc que j'ai lu dans l'aide de Delphi à propos de la méthode LoadFromXml et qui me fait tiquer, je cite :

    Le paramètre XML est une chaîne contenant le texte d'un document XML.Il doit représenter le texte XML codé en utilisant UTF-8,Unicode ou UTF-16.

  7. #7
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    En pas à pas l'erreur est sur : XMLNode1 := ChildNodes.Nodes['mt'];
    DocumentElement ne marche pas ici. (Violation d'accès)


    J'ai essayé d"insérer (je n'aime pas les with pour le débugage, j'ai mis une variable):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      test : WideString; // Caractère Unicode comme la représentation mémoire du fichier XML.
    begin
      // ...
      // Le noeud fils 1 correspond à mt
          test := document.ChildNodes.Nodes[1].NodeName;
     
          XMLNode1 := document.ChildNodes.Nodes[test];
      // ...
    Et je me retrouve avec une erreur abstraite au lieu de la violation d'accès.

    Par contre, retrouver une node par son nom me paraît bizarre de cette, façon, car si plusieurs nodes ont le même nom, il est impossible de récupérer la deuxième.

    Solution:
    Passer par une boucle sur les ChildNodes et tester la NodeName est bien 'mt' et ainsi de suite.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Solution??
    Que faire pour lire la valeur de STATUS dans cette chaine qui restera toujours FIXE:

    <?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>
    Merci

  9. #9
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Par contre en posant un document TXMLDocument et en renseignant la propriété XML directement dans l'éditeur le code de départ fonctionne.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    La réponse est ici:

    http://www.developpez.net/forums/showthread.php?t=32043



    with TXMLDocument.Create(nil) do

    deviens:

    with TXMLDocument.Create(application) do

    Merci quand même ;-)

Discussions similaires

  1. ReportPrinterDialog (QR2) : violation d'accès..
    Par Harry dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 14h04
  2. [XMLDocument] Violation d'accès
    Par xant dans le forum Composants VCL
    Réponses: 8
    Dernier message: 29/09/2004, 15h39
  3. requete / violation d'accès
    Par marie253 dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/08/2004, 13h29
  4. Violation d'acces apres Execute
    Par SegmentationFault dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 10/08/2004, 16h23
  5. Violation d'accès apres Close
    Par SegmentationFault dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/07/2004, 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