Page 1 sur 1

Boucle et xml

Publié : dim. 16/mars/2014 18:23
par MetalOS
Salut tous le monde,

Pour un de mes nombreux projet je doit récupérer les données d'un fichier xml dont voici un exemple:

Code : Tout sélectionner

<markers time="16:50(UTC)" counter="10">
<marker id="d34efcab51953d0b818395d11a123d0c" datetime="2014-03-16 16:40:36" strength="4.56" lat="47.286192" lng="24.178260"/>
<marker id="65e19a4902592c0098cbbc477044f18a" datetime="2014-03-16 16:45:03" strength="5.83" lat="47.295484" lng="24.112949"/>
<marker id="8f777ed3e5847c5f144c5bf4a0276c54" datetime="2014-03-16 16:49:51" strength="19.21" lat="33.458911" lng="22.946880"/>
<marker id="f81868f2b40c2ac181724ebfda402542" datetime="2014-03-16 16:35:35" strength="3.79" lat="47.327942" lng="24.001179"/>
<marker id="fef7af47a5b4db3d4c806a397c1349a4" datetime="2014-03-16 16:35:35" strength="12.49" lat="47.385373" lng="24.256635"/>
<marker id="abeef7f87af537b0d6b521d4accdd39f" datetime="2014-03-16 16:35:35" strength="5.36" lat="47.309449" lng="24.289820"/>
<marker id="21f9e4c8fa9d871ee134c289a16be310" datetime="2014-03-16 16:36:33" strength="4.08" lat="47.368426" lng="24.269781"/>
<marker id="a6ee50c0d09dc356cd62403eb1eb8ef8" datetime="2014-03-16 16:36:33" strength="4.35" lat="47.429556" lng="23.875998"/>
<marker id="240c27b91df2e382e8cf2585a55d4f42" datetime="2014-03-16 16:39:03" strength="5.87" lat="47.303571" lng="24.167737"/>
<marker id="bac21947fa3522f6c7e8fa9a27fbbac5" datetime="2014-03-16 16:39:04" strength="4.51" lat="47.326119" lng="24.144336"/>
</markers>
Je doit récupérer le contenue de chaques "lat" et "lng" qui ce trouve dans chaque noeud "marker". Voici la portion de code que j'essaye d'utiliser pour lire ligne par ligne et récupérer les information qu'il me faut mais sans succès car je récupère uniquement les données du premier noeud et rien d'autre. J'avoue être vraiment perdu avec le xml.

Code : Tout sélectionner

If LoadXML(#xmlBlitz, "Blitz.xml", #PB_UTF8)
   If XMLStatus(#xmlBlitz) <> #PB_XML_Success
    Message$ = "Fichier XML Corrompu" + Chr(13)
    Message$ + "Message: " + XMLError(#xmlBlitz) + Chr(13)
    Message$ + "Ligne: " + Str(XMLErrorLine(#xmlBlitz)) + "   Caractere: " + Str(XMLErrorPosition(#xmlBlitz))
    MessageRequester("Erreur", Message$)
    
    End ;Sortie
   EndIf 
   
   *nodemarkers = XMLNodeFromPath(MainXMLNode(#xmlBlitz), "marker")    
   
   ExamineXMLAttributes(*nodemarkers)
    While NextXMLAttribute(*nodemarkers)  
      Lat$ = GetXMLAttribute(*nodemarkers, "lat")
      Lng$ = GetXMLAttribute(*nodemarkers, "lng")
    Wend
    Debug lat$ 
    Debug lng$
    
  EndIf
Merci d'avance pour votre aide.

Re: Boucle et xml

Publié : dim. 16/mars/2014 19:31
par falsam
J'avais déjà fait un code pour un de tes fichiers XML mais cette fois çi la demande est différentes car il s'agit d'extraire les attributs des différents nœuds de ton fichier.

Code : Tout sélectionner

Enumeration
  #XML
EndEnumeration

Procedure File_Load(*CurrentNode, CurrentSublevel)
  Protected *ChildNode, NodeName.s, NodeText.s, N.i
    
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal  
    NodeName = GetXMLNodeName(*CurrentNode) ; Nom du noeud
    ;//NodeText = GetXMLNodeText(*CurrentNode) ; Valeur du noeud
  EndIf
  
  Select NodeName
    Case "markers"
      Debug GetXMLAttribute(*CurrentNode, "time")
                  
    Case "marker"
      Debug GetXMLAttribute(*CurrentNode, "lat") + " - " + GetXMLAttribute(*CurrentNode, "lng")
      
  EndSelect
      
  *ChildNode = ChildXMLNode(*CurrentNode)
  
  While *ChildNode <> 0
    File_Load(*ChildNode, CurrentSublevel + 1)      
    *ChildNode = NextXMLNode(*ChildNode)
  Wend 
  
EndProcedure

Procedure File_Open(XMLFile.s)
  If XMLFile <> ""
    If LoadXML(#XML, XMLFile)      
      If XMLStatus(#XML) <> #PB_XML_Success
        Message$ + "Message: " + XMLError(#XML) + Chr(13)
        Message$ + "Li : " + Str(XMLErrorLine(#XML)) + "   Car : " + Str(XMLErrorPosition(#XML))
        MessageRequester("Information", Message$)
      EndIf
    
      *MainNode = MainXMLNode(#XML)      
      If *MainNode
        File_Load(*MainNode, 0)
      EndIf 
    EndIf
    
    FreeXML(#XML)
  EndIf
EndProcedure

File_Open("Blitz.xml")

Re: Boucle et xml

Publié : dim. 16/mars/2014 21:00
par MetalOS
oui j'ai essayer aussi de me baser sur l'exemple que tu m'avait donné sans trouver de solution. Une fois de plus merci falsam :wink:

Re: Boucle et xml

Publié : ven. 23/mai/2014 15:27
par MetalOS
Je relance le sujet car je cherche à récupérer la valeur de "counter" de la première ligne de mon fichier xml dont voici un exemple:

Code : Tout sélectionner

<markers time="16:50(UTC)" counter="10">
<marker id="d34efcab51953d0b818395d11a123d0c" datetime="2014-03-16 16:40:36" strength="4.56" lat="47.286192" lng="24.178260"/>
<marker id="65e19a4902592c0098cbbc477044f18a" datetime="2014-03-16 16:45:03" strength="5.83" lat="47.295484" lng="24.112949"/>
<marker id="8f777ed3e5847c5f144c5bf4a0276c54" datetime="2014-03-16 16:49:51" strength="19.21" lat="33.458911" lng="22.946880"/>
<marker id="f81868f2b40c2ac181724ebfda402542" datetime="2014-03-16 16:35:35" strength="3.79" lat="47.327942" lng="24.001179"/>
<marker id="fef7af47a5b4db3d4c806a397c1349a4" datetime="2014-03-16 16:35:35" strength="12.49" lat="47.385373" lng="24.256635"/>
<marker id="abeef7f87af537b0d6b521d4accdd39f" datetime="2014-03-16 16:35:35" strength="5.36" lat="47.309449" lng="24.289820"/>
<marker id="21f9e4c8fa9d871ee134c289a16be310" datetime="2014-03-16 16:36:33" strength="4.08" lat="47.368426" lng="24.269781"/>
<marker id="a6ee50c0d09dc356cd62403eb1eb8ef8" datetime="2014-03-16 16:36:33" strength="4.35" lat="47.429556" lng="23.875998"/>
<marker id="240c27b91df2e382e8cf2585a55d4f42" datetime="2014-03-16 16:39:03" strength="5.87" lat="47.303571" lng="24.167737"/>
<marker id="bac21947fa3522f6c7e8fa9a27fbbac5" datetime="2014-03-16 16:39:04" strength="4.51" lat="47.326119" lng="24.144336"/>
</markers>
J'essaye avec RootXMLNode(#XML) mais je ne pense pas savoir comment l'utiliser exactement.

Re: Boucle et xml

Publié : ven. 23/mai/2014 21:54
par falsam
Mais heu!!! c'est le meme code que précédement en ajoutant

Code : Tout sélectionner

Debug GetXMLAttribute(*CurrentNode, "counter")
Remplace

Code : Tout sélectionner

Case "markers"
      Debug GetXMLAttribute(*CurrentNode, "time")
par

Code : Tout sélectionner

    Case "markers"
      Debug GetXMLAttribute(*CurrentNode, "time")
      Debug GetXMLAttribute(*CurrentNode, "counter")

Re: Boucle et xml

Publié : ven. 23/mai/2014 23:47
par MetalOS
Alala... je croie que je t'en roulerais une si tu était devant moi.

Merci falsam

PS: Je ne suis pas OMO hein...

Re: Boucle et xml

Publié : sam. 24/mai/2014 2:26
par falsam
MetalOS a écrit :Alala... je croie que je t'en roulerais une si tu était devant moi.
Il y a un univers virtuel ou j'ai l'apparence d'une femme. Alors pourquoi pas hein ? :D

Re: Boucle et xml

Publié : sam. 24/mai/2014 11:34
par MetalOS
Non ont va s'arrêter la c'est bien lol

Re: Boucle et xml

Publié : sam. 24/mai/2014 11:37
par falsam
MetalOS a écrit :Non ont va s'arrêter la c'est bien lol
Don't worry. Just a joke :mrgreen: