XML pour gerer des données.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

XML pour gerer des données.

Message par ThoT »

Serai-ce possible qu'une âme charitable réalise un tuto expliquant la gestion de données via un fichier XML :

- Création du fichier et definition des "elements" (balises)
- Enregistrement des données dans le fichier selon la structure voulue
- Accés aux données stockées
- Ajout de données
- Modification de données
- Suppression de données
- Plus eventuellement des petits "trucs & astuces"...

Un trés trés grand merci à celui ou celle, voir ceux 8) qui repondront à mon appel (de detresse :?: :!: :?: )
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

J'en profite, ce tuto serait utile à plein de débutants, ça m'intéresse aussi énormément pour un de mes projets.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

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.
Image
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

Merci pour la reponse, je commence à y voir plus clair dans l'utilisation du XML.

Toutefois il y a un probléme dans le code :
un message d'erreur avec "Line13 : ChildXMLNode() is not a function, macro, array or linked list"
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oui il faut minimum pb4.10 (beta) téléchargeable si tu as une license
Image
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

Est ce qu'il existe une alternative à la version 4.10 ?
Un parser externe ou autre ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Bah il y avait PureXML de Flype, mais je ne sais pas où cela en est....
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Flype, ton code ne fonctionne pas chez moi. (PB 4.10 b)

Le seul MessageRequester qui apparait à la fin me renvoie "Harry Potter." dans la barre de titre, et rien dans le corps du message.

Avec CallDebugger après "While Propriete", la boucle s'effectue une seule fois, la LinkedList récupère uniquement le premier isdn et une partie du titre, et rien d'autre.

Le visualiseur de bibliothèques indique #XML 9248408, Encoding UTF8, Status 4, Error Not-well formed(Invalid Token)

A la commande "propriete = NextXMLNode(propriete)", propriete passe à 0, et on sort de la boucle.
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

Expliquez moi comment fonctionne un parser XML et je vous en fait un beau tout neuf qui fonctionne! :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

ThoT a écrit :Expliquez moi comment fonctionne un parser XML et je vous en fait un beau tout neuf qui fonctionne! :D
Expliquez moi comment fonctionne un avion, et je vous emmène en Amérique. (Préparez vos bouées, quand même) :mrgreen:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Chris

Règle ton compilateur en UTF-8 pour y voir un peu plus clair :D Ton affichage s'est juste interrompu à un caractère avec accent! J'ai eu la même.

@Flype

Merci pour cet exemple. ça permet de comprendre les bases de la bibliothèque XML.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Progi1984 a écrit :Bah il y avait PureXML de Flype, mais je ne sais pas où cela en est....
ca en est qu'elle existe toujours :D

elle fonctionne bien mais elle ne se programme pas du tout comme la lib xml de purebasic (celle montrée ci dessus). faut s'y habituer un peu et elle a un petit défaut de remonter des erreurs ( n'est-ce pas progi1984 :wink: )

@thot
mais quelle version as tu ?

@chris
merci ollivier, c'est exactement çà.
je l'ai écris en rouge dans mon 1er post pourtant :P

avec çà, çà devrait allé - du moins pour ceux qui ont bien la dern. version de pb :
File:1->Bibliotheque1.xml.zip
Image

sinon je peux faire le meme exemple avec PureXML...
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

j'ai testé PureXML2 avec PB4.10 Beta3 et il fonctionne nickel (Minimum = PB4.02)


telechargeable ici
http://www.purebasic.fr/french/viewtopic.php?t=5075
et prendre le lien : PureXML V2.0 **BETA** pour PB4.02
Dernière modification par Flype le mar. 14/août/2007 22:15, modifié 1 fois.
Image
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Flype a écrit : @chris
merci ollivier, c'est exactement çà.
je l'ai écris en rouge dans mon 1er post pourtant :P

avec çà, çà devrait allé - du moins pour ceux qui ont bien la dern. version de pb :
File:1->Bibliotheque1.xml.zip
Image

sinon je peux faire le meme exemple avec PureXML...
Ah ouais, t'as raison.
C'était pourtant écrit en rouge. :oops: :lol:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

pas de problème :wink:
Image
Répondre