Fichiers : enregistrez en xml !

2/5 (21 avis)

Snippet vu 20 958 fois - Téléchargée 41 fois

Contenu du snippet

Beaucoup de programmes utilisent un enregistrement de fichier, de configuration, de n'importe quoi ... Le problème se pose souvent quant au format à utiliser .
Je ne sais pas vous mais moi la programmation des fichiers en vb, ca m'emmerde .. Dès qu'on veu ajouter des headers, séparer des information, enfin bref, c'est chiant .

Je me penche hier sur le problème de l'enregistrement des fichiers d'un logiciel en cours de "vernissage" : le logiciel enregistre dans un fichier une configuration de boutons pour des périphériques ... mais le problème pour moi est : que se passe t il si on tente d'ouvrir un fichier de config créé dont le périphérique n'existe plus : le fichier fait référence à un joystick qui n'existe plus par exemple (débranché le joystick) ?
Il serait bon d'ajouter en début de fichier la liste des périphériques utilisés . Mouais, le pb est que la longueur de cette liste est variable, enfin la je m'empetre dans le format ... Et la, une lumière jailli du plafond, et je vois en lettres de feu : XML .... Raaah j'avais failli l'oublier celui la !

QU'EST CE QUE LE XML ?
Le xml est un dérivé du html, une sorte de html amélioré quoi . Je suppose que vous avez au moins un minimum de connaissance quant au HTML, que vous savez au moins que c'est formé de balises : <BALISE></BALISE> ... Le but du xml est d'ajouter l'enregistrement de données quelconques dans le fichier ...

UN EXEMPLE VAUT MIEUX QUE MON STYLE LITTERAIRE DEFAILLANT ...
Je remprend l'exemple du logiciel dont j'ai parlé : je veux stocker dans mon fichier, de type dxpfile plusieurs choses :
1- Un header qui contiendra des informations sur le fichier (nom du créateur, numéro de série du logiciel, age du capitaine ...), ainsi que la liste des périphériques utilisés, chacun avec leur nom et leur GUID (numéro caractéristique du périph.)
2- Une liste de liens : action-touches, sous forme de strings.

Le fichier final aura cette forme :

<DXPFILE filename="C:\\Documents and Settings\\Vatoo\\Mes documents\\d.dxp>
<HEADER>
<DEVICES>
<DEVICE guid="GUID_SysMouse">Souris</DEVICE>
<DEVICE guid="GUID_SysKeyboard">Clavier</DEVICE>
</DEVICES>
</HEADER>
Configuration: 
<LINK>Previous@STATE#GUID_SysMouse.14#1</LINK>
<LINK>Next@STATE#GUID_SysKeyboard.2#1</LINK>
<LINK>Next@STATE#GUID_SysKeyboard.3#1</LINK>
<LINK>Play@STATE#GUID_SysKeyboard.4#1</LINK>

</DXPFILE>

C'est pas trop dur a comprendre, c'est comme un arbre qu'on déroule quoi, avec des branches, des sous branches, des feuilles . Chaque branche est appelée ELEMENT avec des sous branches : Du html mais avec des balises personnelles, voila le principe du xml .

COMMENT FAIRE AVEC VB ?
1- Charger la référence : projet>référence>microsoft xml 2.0 (c'est celui que j'ai utilisé, les autres doivent marcher avec quelques modifications peut etre ...)
2- Et on est parti pour un peu de code ....

Source / Exemple :


'On définit xml : c'est lui qui contiendra le document final xml
Dim xml As New MSXML.DOMDocument

'xdoc est l'élément principal : ici dxpfile
Dim xdoc As IXMLDOMElement

'd'autres éléments principaux : header,devices,config, et temp
'pour des éléments temporaires
Dim xheader, xperiphs, xconfig, xtemp As IXMLDOMElement

'On crée l'élément principal
Set xdoc = xml.createElement("DXPFILE")
'On modifie ses attributs : contenus dans la balise, regardez
'le fichier xml résultant pour voir ce que cela modifie 
xdoc.setAttribute "filename", "C:\\Documents and Settings\\Vatoo\\Mes documents\\d.dxp"
'Et on le définit comme enfant du document principal
xml.appendChild xdoc

'On crée le header
Set xheader = xml.createElement("HEADER")
'Et le config
Set xconfig = xml.createElement("CONFIG")

'On définit le header comme fils du document principal
'donc "sous branche" de DXPFILE
xdoc.appendChild xheader

'On crée et on ajoute la sous branche de HEADER
'appellée DEVICES
Set xperiphs = xml.createElement("DEVICES")
xheader.appendChild xperiphs

'On informe vb que config est aussi une sous branche de DXPFILE
xdoc.appendChild xconfig

'On ajoute tous les périphériques
   Set xtemp = xml.createElement("DEVICE")
   xtemp.setAttribute "guid", "GUID_SysKeyboard"
   xtemp.Text = "Clavier" 'Ca c'est pour le contenu meme des balises
   xperiphs.appendChild xtemp 'Et hop, xtemp est un fils de DEVICES

   Set xtemp = xml.createElement("DEVICE")
   xtemp.setAttribute "guid", "GUID_SysMouse"
   xtemp.Text = "Souris" 'idem
   xperiphs.appendChild xtemp 'Et hop, xtemp est un fils de DEVICES

  
 'Ajout des LINKS
  Set xtemp = xml.createElement("LINK")
   xtemp.Text = "Previous@STATE#GUID_SysMouse.14#1"
   xconfig.appendChild xtemp 'Sous branche de CONFIG

  Set xtemp = xml.createElement("LINK")
   xtemp.Text = "Next@STATE#GUID_SysKeyboard.2#1"
   xconfig.appendChild xtemp 'Sous branche de CONFIG

  Set xtemp = xml.createElement("LINK")
   xtemp.Text = "Next@STATE#GUID_SysKeyboard.3#1"
   xconfig.appendChild xtemp 'Sous branche de CONFIG
   
  Set xtemp = xml.createElement("LINK")
   xtemp.Text = "Play@STATE#GUID_SysKeyboard.4#1"
   xconfig.appendChild xtemp 'Sous branche de CONFIG
   

'Puis on définit l'élément principal de xml comme étant xdoc
Set xml.documentElement = xdoc
'Et on enregistre le tout dans un fichier
xml.Save "C:\\Documents and settings\\Vatoo\\Mes documents\\d.dxp"

Conclusion :


Le fichier étant maintenant écrit, il nous reste à le lire, ce qui se fait de la même manière : on définit xml comme MSXML.DOMDocument avec :

Dim xml As New MSXML.DOMDocument

Puis on utilise:

xml.load "C:\\Documents and Settings\\Vatoo\\Mes documents\\d.dxp"

Et on accède aux enfants par les méthodes getelementsbyid pour accéder à un noeud précis (par exemple CONFIG), et aux enfants par les méthodes child, getchild, et quelques autres méthodes, toutes assez bien expliquées par l'explorateur d'objet (rappel : F2), dans la librairie MSXML et le composant DOMDocument, on peut ainsi retrouver l'ensemble de "l'arbre".

Par exemple ici pour retrouver l'ensemble des périphériques :

dim xtemp as msxml.IXMLDOMElement
for each xtemp in xml.getelementsbyid("DEVICE")
msgbox "Le fichier contenait ce périphérique :" & vbcrlf & xtemp.text
next

Pour info, ce DOMDocument permet aussi de créer et charger un fichier HTML pour l'analyser ... Je dis ca en pensant aux codes que j'ai vu qui s'obstinent a vouloir analyser un fichier HTML en utilisant des STRINGS : si votre fichier HTML est bien formulé, DOMDocument fait ca de facon bien plus rapide ....

Vous pouvez aussi regarder ma source "Accéder aux objets d'un webbrowser", dont je ne me rappelle plus le numéro ... Normalement, vous savez maintenant comment manier en un minimum de lignes de codes tous les fichiers html et xml, les modifier, enregistrer, analyser ...

Amusez vous bien
Je reste a votre disposition pour plus d'informations : coutud@hotmail.com

Attention : Je suis en dehors des vacances scolaires en internat, donc sans accès à vb, je ne pourrai donc pas vous envoyer de zip ou vous répondre précisément : je n'ai pas l'intitulé exact de toutes les méthodes en tête ...

A voir également

Ajouter un commentaire Commentaires
matrey Messages postés 399 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 6 septembre 2004
28 déc. 2002 à 20:20
Très bon tutorial, très complet et bien détaillé. Bravo !!!
cs_Hobby Messages postés 116 Date d'inscription mercredi 5 juin 2002 Statut Membre Dernière intervention 17 septembre 2008
17 juin 2003 à 01:44
Impecable comme source, cela fonctionne a merveille.

Juste pour info dans la version 5 de la DLL il y des petits changement:

c'est plus: Dim xml As New MSXML.DOMDocument
mais: Dim xml As New MSXML2.DOMDocument

pour la lecture: Dim xml As New MSXML.DOMDocument
Devient: Dim xml As New MSXML2.DOMDocument
idem pour: dim xtemp as msxml.IXMLDOMElement
devient: dim xtemp as msxml2.IXMLDOMElement

Et enfin plus important:
xml.getelementsbyid("DEVICE")
devient: xml.getElementsByTagName("DEVICE")

Je me pose une question: Peut t'on modifiez un seul paramete ou il faut ré-écrire toutes les données?

a+
Olivier
samirog Messages postés 73 Date d'inscription dimanche 8 juin 2003 Statut Membre Dernière intervention 8 mars 2005
31 déc. 2003 à 16:05
Super tutorial ; dommage qu'il y ait pas de zip. mais vu que c'est très bin expliqué, je met 10/10
cs_Esquisse Messages postés 77 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 20 juillet 2005
9 avril 2004 à 18:27
Pour Hobby,

en fait pour modifier un enregistrement fait comme ca :


xml.getElementsByTagName(Section).Item(0).firstChild.Text = Valeur

oubli pas aussi : xml.save App.Path & "\config.xml"

Note : Si tu as plusieurs données pour ton noeud c'est de la simple gestion d'items (donc je pense que tu sais faire).
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
22 mars 2009 à 15:18
Depuis 2002 ta dû bien progresser en XML.
Ton partage est extra; si ta une source MSXML2 du Document v6, pense à nous.

C'est un plaisir de lire ton code, y a pas assez d'exemple comme celui là.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.