Problème XML : Invalid memory access, Bug ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Problème XML : Invalid memory access, Bug ?

Message par Oliv »

Bonjour,
J'ai un soucis avec le XML, lors de l'appel de la fonction XMLAttributeValue() j'obtiens la bonne valeur, une valeur aléatoire, rien ou le plus souvent Invalid memory access.
Est-ce que je l'utilise mal ou est-ce que c'est un bug ?

Code : Tout sélectionner

Procedure AnalyseXML(*XML.i, Recherche.s)
  Define *Fils.i

  If XMLNodeType(*XML) = #PB_XML_Normal
    ; On cherche l'attribut voulu
    If LCase(GetXMLNodeName(*XML)) = Recherche
      Debug "Recherche : " + Recherche
      ; *****************************
      ; Plante ici !!!!!!!!!
      ; *****************************
      Debug "Attribut : " + XMLAttributeValue(*XML)
    EndIf
        
    ; Si il y a un noeud fils, on recommence
    *Fils = ChildXMLNode(*XML)
    While *Fils <> 0
      AnalyseXML(*Fils, Recherche)      
      *Fils = NextXMLNode(*Fils)
    Wend
  
  EndIf
EndProcedure


Procedure.i ChargerXML(*Buffer.i, Len.i)
  Define XML.i
  ; On charge le fichier XML
  XML = CatchXML(#PB_Any, *Buffer, Len)
  If XML 
    If XMLStatus(XML) <> #PB_XML_Success
      MessageRequester("Erreur", "Erreur XML :" + Chr(13) + "Message: " + XMLError(XML) + Chr(13) + "Ligne: " + Str(XMLErrorLine(XML)) + "   Colonne: " + Str(XMLErrorPosition(XML)))
      FreeXML(XML)
      XML = 0
    EndIf
  EndIf
  ProcedureReturn XML
EndProcedure

; "Fichier" XML
chaine.s = "<?xml version=" + Chr(34) + "1.0" + Chr(34) + " encoding=" + Chr(34) + "UTF-8" + Chr(34) + "?><rss xmlns:itunes=" + Chr(34) + "http://www.itunes.com/DTDs/Podcast-1.0.dtd" + Chr(34) + " version=" + Chr(34) + "2.0" + Chr(34) + "><channel><title>testazer</title></channel></rss>"
Len.i = Len(chaine)
*Buffer.i = AllocateMemory(Len)
PokeS(*Buffer, chaine)

Debug chaine

XML.i = ChargerXML(*Buffer, Len)
If XML
  AnalyseXML(MainXMLNode(XML), "title")
Else
  Debug "Impossible de charger"
EndIf
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Personne n'a d'idées avant que j'aille voir les Anglais ? :oops:
Sachant que ce problème n'arrive apparemment qu'avec la balise "title"
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

la doc dit d'utiliser ExamineXMLAttributes

Code : Tout sélectionner

If ExamineXMLAttributes(*XML)
  While NextXMLAttribute(*XML)
    Debug "Attribut : " + XMLAttributeValue(*XML)
  Wend
EndIf
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Cela plante car tu ne vérifies si le noeud a des attributs.

Je t'ai modifié le code et le contenu du XML.

Code : Tout sélectionner

Procedure AnalyseXML(*XML.l, Recherche.s)
  Define *Fils.i

  If XMLNodeType(*XML) = #PB_XML_Normal
    ; On cherche l'attribut voulu
    If LCase(GetXMLNodeName(*XML)) = Recherche
      If ExamineXMLAttributes(*XML)
        While NextXMLAttribute(*XML)
          Debug XMLAttributeName(*XML) + "=" + Chr(34) + XMLAttributeValue(*XML) + Chr(34) + " "
        Wend
      EndIf
    EndIf
       
    ; Si il y a un noeud fils, on recommence
    *Fils = ChildXMLNode(*XML)
    While *Fils <> 0
      AnalyseXML(*Fils, Recherche)     
      *Fils = NextXMLNode(*Fils)
    Wend
 
  EndIf
EndProcedure


Procedure.i ChargerXML(*Buffer.i, Len.i)
  Define XML.i
  ; On charge le fichier XML
  XML = CatchXML(#PB_Any, *Buffer, Len)
  If XML
    If XMLStatus(XML) <> #PB_XML_Success
      MessageRequester("Erreur", "Erreur XML :" + Chr(13) + "Message: " + XMLError(XML) + Chr(13) + "Ligne: " + Str(XMLErrorLine(XML)) + "   Colonne: " + Str(XMLErrorPosition(XML)))
      FreeXML(XML)
      XML = 0
    EndIf
  EndIf
  ProcedureReturn XML
EndProcedure

; "Fichier" XML
chaine.s = "<?xml version=" + Chr(34) + "1.0" + Chr(34) + " encoding=" + Chr(34) + "UTF-8" + Chr(34) + "?><rss xmlns:itunes=" + Chr(34) + "http://www.itunes.com/DTDs/Podcast-1.0.dtd" + Chr(34) + " version=" + Chr(34) + "2.0" + Chr(34) + "><channel><title user=" + Chr(34) + "2.0" + Chr(34) + ">testazer</title></channel></rss>"
Len.i = Len(chaine)
*Buffer.i = AllocateMemory(Len)
PokeS(*Buffer, chaine)

Debug chaine

XML.i = ChargerXML(*Buffer, Len)
If XML
  AnalyseXML(MainXMLNode(XML), "title")
Else
  Debug "Impossible de charger"
EndIf 
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Rohhh quel idiot :oops: :oops:
Désolé de vous avoir embêtés pour ça....
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Pas de pb ; ca aidera des débutants :)
Répondre