loin d'être un tuto, ca en a pas du tout la prétention,
mais voici déjà une brique de base.
Lire un fichier xml,
Traiter les données (balises, attributs, texte, CDATA)
Remplir une liste chainée
En rapport avec la
bibliothèque de livres dont tu parlais dans l'autre post,
je structurerais mon fichier XML comme çà :
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<bibliotheque>
<livre isbn="">
<titre></titre>
<auteur></auteur>
<genre></genre>
<parution></parution>
<resume><![CDATA[]]></resume>
</livre>
</bibliotheque>
tout fichier xml a une balise principale (et une seule),
ici 'bibliotheque' qui reprend évidemment le concept de ce qu'on va enregistrer dedans.
la 'bibliotheque' est une suite de 'livre'
et un 'livre' ce sont des propriétés titre, auteur, genre, etc...
parmis ces propriétés il y en a 2 spéciales ( c'est pour l'exemple, on aurait pu faire sans ) :
isbn qui est un 'attribut' de livre (et non une balise à part entière)
et CDATA qui est balise XML spéciale. Elle permet - entre autre - de stocker des textes sur plusieurs lignes ou même pourquoi pas des images encodées en base64.
Ce qui donne pour être concret un fichier XML de ce genre :
Enregistrer ce fichier XML 'Bibliotheque1.xml' :
Attention à enregistrer ce fichier en UTF-8 dans votre notepad préféré.
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<bibliotheque>
<livre isbn="2070541274">
<titre>Harry Potter à l'école des sorciers</titre>
<auteur>J. K. Rowling</auteur>
<genre>Fantastique</genre>
<parution>1997</parution>
<resume><![CDATA[Harry vit chez les Dursley.
A onze ans,un géant du nom de Hagrid vient le chercher en lui apprenant qu'il est sorcier et en lui avouant que ses parents ont étés tués par les forces du mal.
Il annonce à Harry qu'il devra aller au collège de sorciers nommé Poudlard.
Arrivé au collège il a beaucoup de choses comme combatre un troll, se servir d'une baguette magique, faire des potions magiques et il a même sauvé la pierre philosophale.
Maintenant il doit retourner chez les Dursley pour l'été.]]></resume>
</livre>
<livre isbn="2070541290">
<titre>Harry Potter et la chambre des secrets</titre>
<auteur>J. K. Rowling</auteur>
<genre>Fantastique</genre>
<parution>1998</parution>
<resume><![CDATA[De retour au collège après avoir passé les vacances avec les Dursley.
Au collège certains élèves ont été victimes d'un mauvais sort, un monstre circule dans les couloirs
et Harry découvre la chambre des secrets qui a èté crée par Serpentard lors d'une dispute avec Gryffondor, Pouffsoufle et Serdaigle
mais cette fois c'est pour sauver la soeur de Ron son ami.
Il devra affronter le monstre qui circule dans les couloirs et bien sûr il reussit.
Encore de retour chez les Dursley.]]></resume>
</livre>
<livre isbn="2070541304">
<titre>Harry Potter et le prisonnier d'Azkaban</titre>
<auteur>J. K. Rowling</auteur>
<genre>Fantastique</genre>
<parution>1999</parution>
<resume><![CDATA[Harry a 13 ans et cette année un prisonnier s'est échappé de la prison, il s'appelle Sirius Black et il cherche à tuer Harry.
Harry a reçu une carte de la part des frère de Ron et avec cette carte il connaît tous les passages secrets de Poudlard.
Un jour il va dans un passage secret et là-bas il y a Sirius Black qui lui dit qu'il est son parrain et qu'il ne lui veut pas de mal,
mais c'est le rat de Ron qui est le serviteur de Voldemort et qui s'est en effet métamorphosé,
il y a eu un combat dur entre lui et Sirius Black et il a réussit a s'échapper maintenant Sirius envoie à Harry du courier à chaque fois.]]></resume>
</livre>
<livre isbn="2070543587">
<titre>Harry Potter et la coupe de feu</titre>
<auteur>J. K. Rowling</auteur>
<genre>Fantastique</genre>
<parution>2000</parution>
<resume><![CDATA[Harry est à Poudlard et il participe au tournoi des sorciers.
Il gagne à chaque fois au dernier jeu, c'est lui et Cédric qui gagnent alors ils prennent la coupe tous les deux
et en la prenant ils remarquent que c'est un "portoloin !" et celui-ci les emmène jusqu'a Voldemort.
Là-bas il arrive un malheur à Cédric et Harry combat Voldemort une fois de plus et repart à Poudlard .
Maintenant Voldemort a repris son pouvoir.]]></resume>
</livre>
<livre isbn="2070556859">
<titre>Harry Potter et l'Ordre du Phoenix</titre>
<auteur>J. K. Rowling</auteur>
<genre>Fantastique</genre>
<parution>2003</parution>
<resume><![CDATA[résumé]]></resume>
</livre>
<livre isbn="2070572676">
<titre>Harry Potter et le Prince de sang-mele</titre>
<auteur>J. K. Rowling</auteur>
<genre>Fantastique</genre>
<parution>2005</parution>
<resume><![CDATA[résumé]]></resume>
</livre>
<livre isbn="0747591059">
<titre>Harry Potter et les Reliques de la Mort</titre>
<auteur>J. K. Rowling</auteur>
<genre>Fantastique</genre>
<parution>2007</parution>
<resume><![CDATA[résumé]]></resume>
</livre>
</bibliotheque>
Les briques pour lire le fichier XML et le stocker dans une liste chainée
Code : Tout sélectionner
Structure LIVRE
isbn.s
titre.s
auteur.s
genre.s
parution.s
resume.s
EndStructure
Procedure.s GetXMLNodeCDATA(*node)
If *node
*node = ChildXMLNode(*node)
If *node And XMLNodeType(*node) = #PB_XML_CData
ProcedureReturn GetXMLNodeText(*node)
EndIf
EndIf
EndProcedure
Procedure.l Bibliotheque_Charger(Fichier.s, livre.LIVRE())
Protected xml.l = LoadXML(#PB_Any, Fichier)
If xml
bibliotheque = MainXMLNode(xml)
If GetXMLNodeName(bibliotheque) = "bibliotheque"
livre = ChildXMLNode(bibliotheque)
While livre
If GetXMLNodeName(livre) = "livre"
If AddElement(livre())
If ExamineXMLAttributes(livre)
livre()\isbn = GetXMLAttribute(livre, "isbn")
EndIf
propriete = ChildXMLNode(livre)
While propriete
Select GetXMLNodeName(propriete)
Case "titre" : livre()\titre = GetXMLNodeText(propriete)
Case "auteur" : livre()\auteur = GetXMLNodeText(propriete)
Case "genre" : livre()\genre = GetXMLNodeText(propriete)
Case "parution" : livre()\parution = GetXMLNodeText(propriete)
Case "resume" : livre()\resume = GetXMLNodeCDATA(propriete)
EndSelect
propriete = NextXMLNode(propriete)
Wend
EndIf
EndIf
livre = NextXMLNode(livre)
Wend
EndIf
FreeXML(xml)
EndIf
ProcedureReturn CountList(livre())
EndProcedure
;====== TEST ======
NewList livre.LIVRE()
If Bibliotheque_Charger("Bibliotheque1.xml", livre())
ForEach livre()
MessageRequester(livre()\titre + ", " + livre()\auteur, livre()\resume)
Next
EndIf
;====== TEST ======
A noter la fonction
GetXMLNodeCDATA(*node)
Cette fonction devrait faire partie de purebasic mais non,
à défaut je l'ai faite moi-même, c'est pas trop dur non plus.