Recherche
1 connecté

  Actuellement : 5 commentaires XML et Delphi

XML et Delphi

 

XML ?

 

XML est une sorte de langage qui permet de structurer des données dans un fichier (j’en vois déjà qui saute au plafond, c’est pas facile à expliquer). En faite c’est une norme qui décrit des règles à respecter afin de créer un document qui contient des données structurées…. Ce qu’il faut avoir à l’esprit c’est que XML tout seul ne sert pas à grand chose…

C’est un peut vague alors on va voir un petit exemple…

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

<Parent>

    je suis le père

    <Enfant>Moi le fils</Enfant>

    <Enfant2>Moi le deuxième fils</Enfant2>

</Parent>

 

XML est composé de balise, la même chose que pour l’html mais en XML aucun jeux de balise existe. Par exemple la première balise <Parent> aurait très bien pu s’appeler toto ou tartempion. Les balise XML ne servent qu’à structurer l’information.

L’avantage du XML c’est que chaque application pourra tirer des informations du document et formater l’aspect visuel à sa manière. Par exemple une page Web en html pourra à l’aide des commandes XSL afficher une jolie page web avec des graphismes. Tout, le texte est tiré du document XML et le formatage graphique est fait par la page web. Un programme (fait en Delphi par exemple…) pourra afficher une présentation totalement différente de la page web mais en affichant exactement le même contenu.

 

Les règles du XML

 

Quelque règles régissent XML (et XSL), ces règles ont été décrites par W3.org en voici les plus importantes (celles que je connais) :

-          Un document XML doit commencer par un en-tête comportant la version ainsi que le charset utiliser (Le type de caractères).

-          Un nodes[1] peut être placé dans un autre nodes mais il ne peuvent être imbriquer… Petit exemple :

<Parent><Enfant></Enfant></Parent> est autorisé

<Parent><Enfant></Parent></Enfant> n’est pas autorisé

-          Un nodes vide peut être écrit sous forme simplifiée : <Toto></Toto> peut être écrit <Toto/>

-          Les commentaires c’est comme en html <!-- Ceci est un commentaire -->

 

Delphi et XML (XMLDocument)

 

Nous allons voir l’utilisation du XML dans Delphi. Pour se faire nous allons utiliser le composant XMLDocument disponible dans l’onglet Internet. Malheureusement ce composant n’est disponible que depuis la version 6 de Delphi Entreprise.

Il existe un moyen pour installer un composant similaire mais je ne vais pas expliquer ça ici (Vous pouvez demander a quelqu'un qui a D6E ou D7 de vous filer le source J je ne sais pas si c’est très conseillé et légal).

Pour créer un fichier XML rien de plus simple, placer un composant XMLDocument sur votre fiche (renommer le en XMLDoc), placer un bouton et un SaveDialog.

Programmer l’événement onClick du bouton comme ci-dessous :

 

if not savedialog1.Execute then Exit;

 

XMLdoc.Version := '1.0';

XMLdoc.Encoding := 'ISO-8859-1';

with XMLdoc.AddChild('Parent') do

  begin

  Text := 'je suis le père';

  AddChild('Enfant').Text := 'Moi le fils';

  AddChild('Enfant2').Text := 'Moi le deuxième fils';

  end;

XMLdoc.SaveToFile(Savedialog1.filename);

 

 

Ce petit bout de code va vous permettre de créer le document en exemple en début de document. La création de « sous-nodes » est facilitée grâce à la génialissimes fonction With qui nous permet de regrouper la création des enfants sous la création du parents. Si l’on avait pas cette fonction on devrait écrire :

 

 

if not savedialog1.Execute then Exit;

 

XMLdoc.Version := '1.0';

XMLdoc.Encoding := 'ISO-8859-1';

 

XMLdoc.AddChild('Parent').Text := 'je suis le père';

XMLdoc.ChildNodes.Nodes['Parent'].AddChild('Enfant').Text := 'Moi le fils';

XMLdoc.ChildNodes.Nodes['Parent'].AddChild('Enfant2').Text := 'Moi le 2ème fils';

 

XMLdoc.SaveToFile(Savedialog1.filename);

 

 

Qui a le grand avantage de mieux nous montrer la structure en arbre du document XML.

La propriété ChildNodes est un tableau contenant tout les Nodes enfants du nodes du dessus… Se qui veut dire que XMLdoc.ChildNodescontient tout les nodes enfants du document c’est à dire uniquement « Parent » dans notre cas. Et que XMLdoc.ChildNodes.Nodes['Parent'].ChildNodescontient tout les nodes enfants de « Parent » c’est à dire « Enfant » et « Enfant2 » dans notre exemple.

 

Nous allons voir maintenant comment lire les informations écrites précédemment dans notre document XML. Placez sur votre fiche (la même que juste avant) un deuxième bouton, un savedialog et un memo. Programmez l’événement onClick de bouton comme ci-dessous :

 

 

if not OpenDialog1.Execute then exit;

 

XMLdoc.LoadFromFile(Opendialog1.filename);

With XMLdoc.ChildNodes.Nodes['Parent'] do

  begin

  Memo1.Lines.Add(ChildNodes.Nodes['Enfant'].Text);

  Memo1.Lines.Add(ChildNodes.Nodes['Enfant2'].Text);

        //Memo1.Lines.Add(Text);

  end;

 

On ne peut pas lire ici le texte de « Parent » en effet comme parent possèdent des enfants la norme XML ne veut pas qu’un Parent possèdent du texte. Notre document XML n’est pas infonctionnel pour autant on est juste pas dans la norme…

Mais rassurer vous le XML à prévu la chose et permet d’ajouter des valeur à une nodes. Par exemple dans notre cas on aurait pu écrire :

 

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

<Parent info="je suis le père ">

    <Enfant>Moi le fils</Enfant>

    <Enfant2>Moi le deuxième fils</Enfant2>

</Parent>

 

Là aussi le nom d’attribut est totalement arbitraire et ne représente rien du point de vu XML on aurait très bien pu marquer toto à la place d’info (<Parent toto="je suis le père ">). Sachez cependant que d’après quelques tests de lecture dans un fichier, la première méthode que nous avons vue est plus rapide que la seconde et surtout elle est plus simple à coder. On peut donc créer notre document XML de cette façon (qui est à mon avis la meilleure) :

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

<Parent>

    <TexteParent>je suis le père </TexteParent>

    <Enfant>Moi le fils</Enfant>

    <Enfant2>Moi le deuxième fils</Enfant2>

</Parent>

 

Il y à donc plusieurs moyens de créer un fichier XML. Ce qui est le plus important, c’est de choisir une structure fixe et simple qui vous convienne a vous et a votre application.

 

Remplacer les fichier ini par du XML

 

Le fichier XML peut être utilisé pour sauver des options, au même titre que les fichiers ini ou la base de registre. En effet le fichier XML aborde la même structure en arbre que le registre mais n’accepte que des string comme le fichier ini. Il sera donc très facile de créer un « super fichier ini ». Cliquez ici pour télécharger l'exemple.

Voici un petit exemple qui montre comment sauver différents paramètres depuis des composant Delphi dans un fichier XML :

 

if not savedialog1.Execute then Exit;

 

XMLdoc.ChildNodes.Clear;

XMLdoc.Version := '1.0';

XMLdoc.Encoding := 'ISO-8859-1';

 

with XMLdoc.AddChild('MainForm') do

  begin

  //sauve la taille et la position de la Form pricipale

  AddChild('Height').Text := inttostr(MainForm.Height);

  AddChild('Width').Text := inttostr(MainForm.Width);

  AddChild('Top').Text := inttostr(MainForm.Top);

  AddChild('Left').Text := inttostr(MainForm.Left);

  with AddChild('Panel1') do

    begin

    AddChild('Caption').Text := Panel1.Caption;                   //un string

    AddChild('Color').Text := colortostring(Panel1.Color);        //un TColor

    AddChild('Boolean').Text := booltostr(CheckBox1.Checked);   //un boolean

    AddChild('Strings').Text := Memo1.Lines.CommaText;          //un Strings

    end;

  end;

XMLdoc.SaveToFile(Savedialog1.filename);

 

Avouez que ce n’est pas bien compliqué !!! La structure est très bien définie ce qui permet de très facilement s’y retrouver. Essayez d’ouvrir vos documents XML avec IE 5.5 ou supérieur vous verrez tout de suite l’indentation du XML. Ce code une fois exécuté donne ce document XML :

 

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<MainForm>

   <Height>480</Height>

   <Width>696</Width>

   <Top>107</Top>

   <Left>233</Left>

   <Panel1>

<Caption>Panel1</Caption>

<Color>clBtnFace</Color>

<Boolean>0</Boolean>

<Strings>Memo1,"Salut comment ca va ???","Bien et toi ???","Bien  merci"

</Strings>

   </Panel1>

</MainForm>

 

Et maintenant, on va lire les options. C’est exactement la même chose… dans l’autre sens…

 

 

if not OpenDialog1.Execute then exit;

 

XMLdoc.LoadFromFile(Opendialog1.filename);

With XMLdoc.ChildNodes.Nodes['MainForm'].ChildNodes do

  begin

  MainForm.Height :=  strtoint(Nodes['Height'].Text);

  MainForm.Width := strtoint(Nodes['Width'].Text);

  MainForm.top :=  strtoint(Nodes['Top'].Text);

  MainForm.left := strtoint(Nodes['Left'].Text);

  With Nodes['Panel1'].ChildNodes do

    begin

    Panel1.Caption := Nodes['Caption'].Text;

    Panel1.Color := Stringtocolor(Nodes['Color'].Text);

    CheckBox1.Checked := strtobool(Nodes['Boolean'].Text);

    Memo1.Lines.CommaText := Nodes['Strings'].Text;

    end;

  end;

 

Si l’on doit sauver les options de plusieurs form on créera un nodes « Application » qui contiendra un nodes « MainForm » un nodes « Form2 » etc…

En effet XML accepte qu’un seul nodes comme (root) nodes de départ du document.

 

Conclusion :

 

Une petit conclusion juste pour dire que dans ce tuto on a vu qu’une petit partie des possibilités de XML. Lle but n’était pas de créer un page Web en XML et Xsl, mais bien de voir à quoi pouvait servir le XML dans Delphi. Bien sûr, le composant XMLDocument possède beaucoup d’autres fonctions que je vous laisse le plaisir de découvrir… Par exemple, dans ces exemple nous n’avons jamais testé si un nodes existait bien avant d’aller lire ces données…

Pour ceux qui desirent plus d’information sur XML et Xsl afin de créer des page web, je vous conseille d’aller faire un petit tour sur ce site : http://www.chez.com/xml/

Si vous avez encore des questions vous pouvez passer sur le forum de www.phidels.com

Un grand merci à Michel pour son site, un grand merci à tout les membres du forum phidels et un grand merci à tout ceux qui on lu ce tuto jusqu’à la fin…

 

Voilà je crois avoir dit tout se que j’avais à dire…

 

Jobe

 

P.S. si vous avez des remarques vous pouvez me mailer à cette adresse jobe_tec@yahoo.fr

 

 

Aperçu de la visualisation de notre document XML dans IE 5.5 ou supérieur….



[1] Un couple de balise s’appelle un Nodes.