Difference between revisions of "XML Tutorial/fr"
m (Text replace - "</xml>" to "</syntaxhighlight>") |
m (Text replace - "delphi>" to "syntaxhighlight>") |
||
Line 29: | Line 29: | ||
L'exemple de code suivant montre la bonne et la mauvaise façon d'obtenir la valeur du nœud texte: | L'exemple de code suivant montre la bonne et la mauvaise façon d'obtenir la valeur du nœud texte: | ||
− | < | + | <syntaxhighlight> |
var | var | ||
PassNode: TDOMNode; | PassNode: TDOMNode; | ||
Line 42: | Line 42: | ||
// Le texte du nœud est réellement un nœud enfant distinct | // Le texte du nœud est réellement un nœud enfant distinct | ||
WriteLn(PassNode.FirstChild.NodeValue); // affiche correctement "abc" | WriteLn(PassNode.FirstChild.NodeValue); // affiche correctement "abc" | ||
− | </ | + | </syntaxhighlight> |
=== Afficher les noms des noeuds === | === Afficher les noms des noeuds === | ||
Line 62: | Line 62: | ||
Et ici le code Pascal pour exécuter la tâche: | Et ici le code Pascal pour exécuter la tâche: | ||
− | < | + | <syntaxhighlight> |
var | var | ||
Documento: TXMLDocument; | Documento: TXMLDocument; | ||
Line 83: | Line 83: | ||
Documento.Free; | Documento.Free; | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
Ce qui affichera: | Ce qui affichera: | ||
Line 99: | Line 99: | ||
La fonction ci-dessous va prendre un document XML précédement chargé depuis un fichier ou généré par code, et va peupler un TreeView avec son contenu. Le Caption de chaque noeud sera le contenu du premier attribut de chaque noeud. | La fonction ci-dessous va prendre un document XML précédement chargé depuis un fichier ou généré par code, et va peupler un TreeView avec son contenu. Le Caption de chaque noeud sera le contenu du premier attribut de chaque noeud. | ||
− | < | + | <syntaxhighlight> |
procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument); | procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument); | ||
var | var | ||
Line 132: | Line 132: | ||
end; | end; | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
=== Modifier un document XML === | === Modifier un document XML === | ||
Line 142: | Line 142: | ||
Ci-dessous se trouvent quelques méthodes courantes de TDOMDocument: | Ci-dessous se trouvent quelques méthodes courantes de TDOMDocument: | ||
− | < | + | <syntaxhighlight> |
function CreateElement(const tagName: DOMString): TDOMElement; virtual; | function CreateElement(const tagName: DOMString): TDOMElement; virtual; | ||
function CreateTextNode(const data: DOMString): TDOMText; | function CreateTextNode(const data: DOMString): TDOMText; | ||
Line 148: | Line 148: | ||
virtual; | virtual; | ||
function CreateAttribute(const name: DOMString): TDOMAttr; virtual; | function CreateAttribute(const name: DOMString): TDOMAttr; virtual; | ||
− | </ | + | </syntaxhighlight> |
Et ici un exemple de méthode qui localisera l'item selectionné dans un TTreeView et qui insère un noeud enfant au document XML qu'il représente. Le TreeView doit être précédement rempli avec le contenu du fichier XML en utilisant la [[Networking#Populating a TreeView with XML|fonction XML2Tree]]. | Et ici un exemple de méthode qui localisera l'item selectionné dans un TTreeView et qui insère un noeud enfant au document XML qu'il représente. Le TreeView doit être précédement rempli avec le contenu du fichier XML en utilisant la [[Networking#Populating a TreeView with XML|fonction XML2Tree]]. | ||
− | < | + | <syntaxhighlight> |
procedure TForm1.actAddChildNode(Sender: TObject); | procedure TForm1.actAddChildNode(Sender: TObject); | ||
var | var | ||
Line 186: | Line 186: | ||
end; | end; | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
Line 193: | Line 193: | ||
Etant donné un fichier XML dans MyXmlString, le code suivant va créer son DOM: | Etant donné un fichier XML dans MyXmlString, le code suivant va créer son DOM: | ||
− | < | + | <syntaxhighlight> |
Var | Var | ||
S : TStringStream; | S : TStringStream; | ||
Line 210: | Line 210: | ||
end; | end; | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
== Liens Externes == | == Liens Externes == |
Revision as of 15:12, 24 March 2012
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
magyar (hu) │
Bahasa Indonesia (id) │
italiano (it) │
日本語 (ja) │
한국어 (ko) │
português (pt) │
русский (ru) │
中文(中国大陆) (zh_CN) │
Introduction
Le langage de balises extensible (Extensible Markup language) est un langage recommandé par le W3C créé pour l'échange d'information entre différents systèmes. C'est une façon de stocker l'information sous forme de texte. Les langages modernes d'échange de données comme le XHTML, tout comme la plupart des technologies WebServices, sont basées sur le XML.
Il existe actuellement un ensemble d'unités qui offrent le support du XML au Free Pascal. Ces unités sont appelées "XMLRead", "XMLWrite" et "DOM" et elles font parties de la Free Component Library (FCL) du Free Pascal Compiler. La FCL est déjà dans le chemin de recherche par défaut pour le compilateur de Lazarus, vous n'avez donc besoin que d'ajouter ces unités à votre clause uses afin d'obtenir le support du XML. La FCL n'est pas documentée actuellement (October / 2005), c'est pourquoi ce petit tutoriel vise à introduire l'accès au XML en utilisant ces unités.
Le DOM XML (Document Object Model) est un ensemble d'objets standardisés offrant une interface similaire pour l'utilisation du XML dans différents langages et systèmes. Le standard spécifie uniquement les méthodes, propriétés et autres parties d'interface de l'objet, laissant l'implémentation libre pour les différents langages. La FCL supporte totalement le XML DOM 1.0.
Exemples
Ci-dessous se trouve une liste d'exemples de manipulation de données XML qui croissent en complexité.
Lire un nœud de texte
Pour les programmeurs Delphi: Notez que lorsque vous travaillez avec TXMLDocument, le texte à l'intérieur d'un Node est considéré comme un Node TEXT séparé. Vous devez donc accéder à une valeur texte de nœud comme à un nœud séparé. Par exemple, considérez le XML suivant:
<?xml version="1.0"?>
<request>
<request_type>PUT_FILE</request_type>
<username>123</username>
<password>abc</password>
</request>
L'exemple de code suivant montre la bonne et la mauvaise façon d'obtenir la valeur du nœud texte:
var
PassNode: TDOMNode;
Doc: TXMLDocument;
begin
// Lit le fichier xml depuis le disque
ReadXMLFile(Doc, 'c:\xmlfiles\test.xml');
// Récupère le nœud "password"
PassNode := Doc.DocumentElement.FindNode('password');
// Ecrit la valeur du nœud sélectionné
WriteLn(PassNode.NodeValue); // ce sera vide
// Le texte du nœud est réellement un nœud enfant distinct
WriteLn(PassNode.FirstChild.NodeValue); // affiche correctement "abc"
Afficher les noms des noeuds
L'exemple suivant montre comment afficher les noms des noeuds dans un TMemo placé sur une fiche.
Ci-dessous le fichier XML appellé 'C:\Programas\teste.xml':
<?xml version="1.0"?>
<images directory="mydir">
<imageNode URL="graphic.jpg" title="">
<Peca DestinoX="0" DestinoY="0">Pecacastelo.jpg1.swf</Peca>
<Peca DestinoX="0" DestinoY="86">Pecacastelo.jpg2.swf</Peca>
</imageNode>
</images>
Et ici le code Pascal pour exécuter la tâche:
var
Documento: TXMLDocument;
i, j: Integer;
begin
ReadXMLFile(Documento, 'C:\Programas\teste.xml');
Memo.Lines.Clear;
with Documento.DocumentElement.ChildNodes do
begin
for i := 0 to (Count - 1) do
begin
Memo.Lines.Add(Item[i].NodeName + ' ' + Item[i].Attributes.Item[0].NodeValue);
for j := 0 to (Item[i].ChildNodes.Count - 1) do
begin
Memo.Lines.Add(Item[i].ChildNodes.Item[j].NodeName + ' '
+ Item[i].ChildNodes.Item[j].FirstChild.NodeValue);
end;
end;
end;
Documento.Free;
end;
Ce qui affichera:
imageNode graphic.jpg Peca Pecacastelo.jpg1.swf Peca Pecacastelo.jpg1.swf
Peupler un TreeView avec XML
Une utilisation courante des ficher XML est de les parser et d'afficher leur contenu sous forme d'arborescence. Vous pouvez trouver le composant TTreeView sous l'onglet "Common Controls" de Lazarus.
La fonction ci-dessous va prendre un document XML précédement chargé depuis un fichier ou généré par code, et va peupler un TreeView avec son contenu. Le Caption de chaque noeud sera le contenu du premier attribut de chaque noeud.
procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument);
var
iNode: TDOMNode;
procedure ProcessNode(Node: TDOMNode; TreeNode: TTreeNode);
var
cNode: TDOMNode;
begin
if Node = nil then Exit; // Stoppe si on a atteint une feuille
// Ajoute un noeud à l'arbre
TreeNode := tree.Items.AddChild(TreeNode, Node.Attributes[0].NodeValue);
// Va au noeud enfant
cNode := Node.ChildNodes.Item[0];
// Traite tous les noeuds enfants
while cNode <> nil do
begin
ProcessNoDe(cNode, TreeNode);
cNode := cNode.NextSibling;
end;
end;
begin
iNode := XMLDoc.DocumentElement.ChildNodes.Item[0];
while iNode <> nil do
begin
ProcessNode(iNode, nil); // Recursive
iNode := iNode.NextSibling;
end;
end;
Modifier un document XML
La première chose à se rappeler est que TDOMDocument est le "handle" vers le DOM. Vous pouvez obtenir une instance de cette classe en créant ou en chargeant un document XML.
D'un autre côté, les noeuds ne peuvent être créés comme des objets classiques. Vous *devez* utiliser les méthodes mises à disposition par TDOMDocument pour les créer, et celles-ci utilisent les autres méthodes pour les mettre à la bonne place dans l'arbre. Cela est dû au fait que les noeuds doivent être "possédés" par un document spécifique du DOM.
Ci-dessous se trouvent quelques méthodes courantes de TDOMDocument:
function CreateElement(const tagName: DOMString): TDOMElement; virtual;
function CreateTextNode(const data: DOMString): TDOMText;
function CreateCDATASection(const data: DOMString): TDOMCDATASection;
virtual;
function CreateAttribute(const name: DOMString): TDOMAttr; virtual;
Et ici un exemple de méthode qui localisera l'item selectionné dans un TTreeView et qui insère un noeud enfant au document XML qu'il représente. Le TreeView doit être précédement rempli avec le contenu du fichier XML en utilisant la fonction XML2Tree.
procedure TForm1.actAddChildNode(Sender: TObject);
var
Posicao: Integer;
NovoNo: TDomNode;
begin
{*******************************************************************
* Detects the selected element
*******************************************************************}
if TreeView1.Selected = nil then Exit;
if TreeView1.Selected.Level = 0 then
begin
Posicao := TreeView1.Selected.Index;
NovoNo := XMLDoc.CreateElement('item');
TDOMElement(NovoNo).SetAttribute('nome', 'Item');
TDOMElement(NovoNo).SetAttribute('arquivo', 'Arquivo');
XMLDoc.DocumentElement.ChildNodes.Item[Posicao].AppendChild(NovoNo);
{*******************************************************************
* Updates the TreeView
*******************************************************************}
TreeView1.Items.Clear;
XML2Tree(TreeView1, XMLDoc);
end
else if TreeView1.Selected.Level >= 1 then
begin
{*******************************************************************
* This function only works on the first level of the tree,
* but can easely modifyed to work for any number of levels
*******************************************************************}
end;
end;
Créer un TXMLDocument à partir d'une chaîne
Etant donné un fichier XML dans MyXmlString, le code suivant va créer son DOM:
Var
S : TStringStream;
XML : TXMLDocument;
begin
S:= TStringStream.Create(MyXMLString);
Try
S.Position:=0;
XML:=Nil;
ReadXMLFile(XML,S); // Document XML complet
// Alternatively:
ReadXMLFragment(AParentNode,S); // Lit uniquement un fragment XML.
Finally
S.Free;
end;
end;
Liens Externes
- W3Schools Tutoriel XML
- Thomas Zastrow article FPC et XML