Page 1 sur 1

Problème XML : Invalid memory access, Bug ?

Publié : dim. 28/déc./2008 23:55
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

Publié : ven. 02/janv./2009 17:12
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"

Publié : ven. 02/janv./2009 17:20
par comtois
la doc dit d'utiliser ExamineXMLAttributes

Code : Tout sélectionner

If ExamineXMLAttributes(*XML)
  While NextXMLAttribute(*XML)
    Debug "Attribut : " + XMLAttributeValue(*XML)
  Wend
EndIf

Publié : ven. 02/janv./2009 17:26
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 

Publié : dim. 04/janv./2009 11:14
par Oliv
Rohhh quel idiot :oops: :oops:
Désolé de vous avoir embêtés pour ça....

Publié : dim. 04/janv./2009 12:39
par Progi1984
Pas de pb ; ca aidera des débutants :)