Difference between revisions of "XML Tutorial/fr"

From Free Pascal wiki
Jump to navigationJump to search
Line 9: Line 9:
 
Le DOM XML (Document Object Model) est un ensemble d'objets standardisée offrent une interface 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  [http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/ XML DOM 1.0].
 
Le DOM XML (Document Object Model) est un ensemble d'objets standardisée offrent une interface 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  [http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/ XML DOM 1.0].
  
== Examples ==
+
== Exemples ==
  
Bellow there is a list of XML data manipulation examples with growing complexity.
+
Ci-dessous se trouve une liste d'exemples de manipulation de données XML qui croissent en complexité.
  
=== Reading a text node ===
+
=== Lire un noeud de texte ===
  
For Delphi Programmers:
+
Pour les programmeurs Delphi:
Note that when working with TXMLDocument, the text within a Node is considered a separate TEXT NodeAs a result, you must access a node's text value as a separate nodeFor instance, consider the following XML:
+
Notez que lorsque vous travaillez avec TXMLDocument, le texte à l'intérieur d'un Node es considéré comme une Node TEXT séparéVous devez donc accéder à une valeur texte de noeud comme à un noeud séparéPar exemple, considérez le  XML suivant:
  
 
<xml>
 
<xml>
Line 27: Line 27:
 
</xml>
 
</xml>
  
The following code example shows both the correct and the incorrect ways of getting the value of the text node:
+
L'exemple de code suivant montre la bonne et la mauvaise façon d'obtenir la valeur du noeud texte:
  
 
<delphi>
 
<delphi>
Line 34: Line 34:
 
   Doc:      TXMLDocument;
 
   Doc:      TXMLDocument;
 
  begin
 
  begin
   // Read in xml file from disk
+
   // Lis le fichier xml depuis le disque
 
   ReadXMLFile(Doc, 'c:\xmlfiles\test.xml');
 
   ReadXMLFile(Doc, 'c:\xmlfiles\test.xml');
   // Retrieve the "password" node
+
   // Récupère le noeud "password"
 
   PassNode := Doc.DocumentElement.FindNode('password');
 
   PassNode := Doc.DocumentElement.FindNode('password');
   // Write out value of the selected node
+
   // Ecrit la valeur du noeud sélectionné
   WriteLn(PassNode.NodeValue); // will be blank
+
   WriteLn(PassNode.NodeValue); // ce sera vide
   // The text of the node is actually a separate child node
+
   // Le texte du noeud est réellement  un noeud enfant distinct
   WriteLn(PassNode.FirstChild.NodeValue); // correctly prints "abc"
+
   WriteLn(PassNode.FirstChild.NodeValue); // affiche correctement "abc"
 
</delphi>
 
</delphi>
  
=== Printing the names of nodes ===
+
=== Afficher les noms des noeuds ===
  
The following example shows how to print the names of nodes to a TMemo placed on a form.
+
L'exemple suivant montre comment afficher les noms des noeuds dans un TMemo placé sur une fiche.
  
Bellow is the XML file called 'C:\Programas\teste.xml':
+
Ci-dessous le fichier XML appellé 'C:\Programas\teste.xml':
  
 
<xml>
 
<xml>
Line 60: Line 60:
 
</xml>
 
</xml>
  
And here the Pascal code to execute the task:
+
Et ici le code Pascal pour exécuter la tâche:
  
 
<delphi>
 
<delphi>
Line 85: Line 85:
 
</delphi>
 
</delphi>
  
This will print:
+
Ce qui affichera:
  
 
<pre>
 
<pre>
Line 93: Line 93:
 
</pre>
 
</pre>
  
=== Populating a TreeView with XML ===
+
=== Peupler un TreeView avec XML ===
  
One common use of XML files is to parse them and show their contents in a tree like format. You can find the TTreeView component on the "Common Controls" tab on Lazarus.
+
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.
  
The function below will take a XML document previously loaded from a file or generated on code, and will populate a TreeView with it´s contents. The caption of each node will be the content of the first attribute of each node.
+
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.
  
 
<delphi>
 
<delphi>
Line 108: Line 108:
 
     cNode: TDOMNode;
 
     cNode: TDOMNode;
 
   begin
 
   begin
     if Node = nil then Exit; // Stops if reached a leaf
+
     if Node = nil then Exit; // Stoppe si on a atteint une feuille
 
      
 
      
     // Adds a node to the tree
+
     // Ajoute un noeud à l'arbre
 
     TreeNode := tree.Items.AddChild(TreeNode, Node.Attributes[0].NodeValue);
 
     TreeNode := tree.Items.AddChild(TreeNode, Node.Attributes[0].NodeValue);
  
     // Goes to the child node
+
     // Va au noeud enfant
 
     cNode := Node.ChildNodes.Item[0];
 
     cNode := Node.ChildNodes.Item[0];
  
     // Processes all child nodes
+
     // Traite tous les noeuds enfants
 
     while cNode <> nil do
 
     while cNode <> nil do
 
     begin
 
     begin
Line 134: Line 134:
 
</delphi>
 
</delphi>
  
=== Modifying a XML document ===
+
=== Modifier un document XML ===
  
The first thing to remember is that TDOMDocument is the "handle" to the DOM. You can get an instance of this class by creating one or by loading a XML document.
+
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.
  
Nodes on the other hand cannot be created like a normal object. You *must* use the methods provided by TDOMDocument to create them, and latter use other methods to put them on the correct place on the tree. This is because nodes must be "owned" by a specific document on DOM.
+
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.
  
Below are some common methods from TDOMDocument:
+
Ci-dessous se trouvent quelques méthodes courantes de TDOMDocument:
  
 
<delphi>
 
<delphi>
Line 150: Line 150:
 
</delphi>
 
</delphi>
  
And here an example method that will located the selected item on a TTreeView and then insert a child node to the XML document it represents. The TreeView must be previously filled with the contents of a XML file using the [[Networking#Populating a TreeView with XML|XML2Tree function]].
+
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]].
  
 
<delphi>
 
<delphi>
Line 189: Line 189:
  
  
=== Create a TXMLDocument from a string ===
+
=== Créer un TXMLDocument à partir d'une chaîne ===
  
Given al XML file in MyXmlString, the following code will create it's DOM:
+
Etant donné un fichier XML dans MyXmlString, le code suivant va créer son DOM:
  
 
<delphi>
 
<delphi>
Line 203: Line 203:
 
     S.Position:=0;
 
     S.Position:=0;
 
     XML:=Nil;
 
     XML:=Nil;
     ReadXMLFile(XML,S); // Complete XML document
+
     ReadXMLFile(XML,S); // Document XML complet
 
     // Alternatively:
 
     // Alternatively:
     ReadXMLFragment(AParentNode,S); // Read only XML fragment.
+
     ReadXMLFragment(AParentNode,S); // Lit uniquement un fragment XML.  
 
   Finally
 
   Finally
 
     S.Free;
 
     S.Free;

Revision as of 14:17, 16 June 2008

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 Extensible Markup Language est un langage recommandé par le W3C créé pour l'echange 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 appellé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ée offrent une interface 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 noeud de texte

Pour les programmeurs Delphi: Notez que lorsque vous travaillez avec TXMLDocument, le texte à l'intérieur d'un Node es considéré comme une Node TEXT séparé. Vous devez donc accéder à une valeur texte de noeud comme à un noeud séparé. Par exemple, considérez le XML suivant:

<xml>

<?xml version="1.0" encoding="utf-8"?>
<request>
  <request_type>PUT_FILE</request_type>
  <username>123</username>
  <password>abc</password>
</request>

</xml>

L'exemple de code suivant montre la bonne et la mauvaise façon d'obtenir la valeur du noeud texte:

<delphi>

var
 PassNode: TDOMNode;
 Doc:      TXMLDocument;
begin
 // Lis le fichier xml depuis le disque
 ReadXMLFile(Doc, 'c:\xmlfiles\test.xml');
 // Récupère le noeud "password"
 PassNode := Doc.DocumentElement.FindNode('password');
 // Ecrit la valeur du noeud sélectionné
 WriteLn(PassNode.NodeValue); // ce sera vide
 // Le texte du noeud est réellement  un noeud enfant distinct
 WriteLn(PassNode.FirstChild.NodeValue); // affiche correctement "abc"

</delphi>

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>

<?xml version="1.0" encoding="ISO-8859-1"?>
<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>

</xml>

Et ici le code Pascal pour exécuter la tâche:

<delphi>

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;

</delphi>

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.

<delphi> 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; </delphi>

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:

<delphi>

  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;

</delphi>

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.

<delphi> 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; </delphi>


Créer un TXMLDocument à partir d'une chaîne

Etant donné un fichier XML dans MyXmlString, le code suivant va créer son DOM:

<delphi> 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; </delphi>

External Links