P
'
t
i
t
e
C
h
a
t
t
e
 
spacer~ "COPY FROM ONE, IT'S PLAGIARISM; COPY FROM MANY, IT'S RESEARCH." Articles | Connexion
 
~Rebol et XML

 Présentation

L'étonnant langage Rebol montre une nouvelle fois sa puissance en proposant nativement un moyen rapide de parcourir des documents XML. Une unique fonction crée un arbre XML en mémoire.
 Sommaire


 Introduction

La lecture d'un document XML en Rebol passe par l'invocation de la fonction parse-xml. La valeur prise comme argument de cette fonction doit contenir le code XML à parcourir. En retour la fonction renvoie une liste de liste, décrivant l'arbre XML du document.

Examinons un exemple simple :

parse-xml "<root />"
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
La valeur renvoyée est [document none ["root" none none]]. Nous sommes en présence d'une liste toujours construite ainsi : [élément attributs contenu]. Les attributs, à l'instar du contenu, sont décrits par des listes, ou blocs. La traduction Rebol de [document none ["root" none ["child" ["name" "enfant"] ["hello"]]] correspond au document XML suivant :

<root>
  <child name="enfant">
    hello
  </child>
</root>
       
      
JextCopier dans Jext
Les attributs se placent dans une liste de la forme [nom valeur nom valeur .]. Les deux premiers éléments de la liste indiquent toujours les valeurs document et none.


 Re-le-bol de XML

Le script Rebol que nous étudions se nomme xml.r. Ce dernier contient une fonction print-tag[xml level] capable d'afficher un arbre XML. Acceptons la dure réalité, ce script est d'une inutilité rare puisqu'il se contente d'afficher un document XML après l'avoir parsé. Cette fonction se veut bien entendu récursive. Son principe reste simple.

Pour chaque "noeud", c'est à dire chaque élément de la liste xml donnée en paramètre, la fonction récupère trois données qui sont le nom du tag, ses attributs et son contenu :

set [label attribute content] node
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
La première action du script consiste à afficher la balise ouvrante. Pour cela, le nom de l'élément et ses attributs sont placés dans une chaîne nommée stringed, affichée par la suite. Nous avons vu que les attributs se définissaient par paires. La boucle permettant leur lecture emploie les blocs :

foreach [attr value] attribute [ . ]
       
      
JextCopier dans Jext
La valeur attr contient le nom de l'attribut et value sa valeur. La partie la plus difficile concerne le contenu des noeuds. Un contenu peut revêtir deux formes. La première s'incarne en un bloc de blocs de trois éléments. Dans ce cas, le contenu correspond à un ou plusieurs éléments enfants. La seconde forme du contenu revêt l'aspect d'une liste doté d'un unique élément de type chaîne de caractère.

Cette situation correspond à une balise de type <b>texte</b>. Voici, dans l'ordre, les représentations des deux formes :

[[tag attributs contenu] [.] .]
["texte"]
       
      
JextCopier dans Jext
La différenciation des deux formes repose sur un double test. Le premier terme du test correspond à la longueur de la liste : elle doit être de un. Néanmoins, cela reste insuffisant. En effet, une liste de un élément pourrait correspond à une balise enfant. Le second test porte donc sur la nature du premier élément de la liste.

S'il s'agit d'une chaîne de caractère, nous avons révélé la seconde forme :

either (length? content) = 1 and (string? first content) [
  ; afficher le contenu
][ ; continuer récursivement
]
       
      
JextCopier dans Jext
Le reste du script vous semblera relativement trivial. L'unique subtilité se réfère à l'emploi de la fonction to-tag de Rebol. Cette fonction génère une balise à partir d'une valeur. Cela signifie que l'expression to-tag "html" renvoie la valeur <html>. Couplé à la puissante fonction read, la fonction parse-xml parvient à faire des merveilles dans le cadre d'applications distantes.



par Romain Guy
romain.guy@jext.org
http://www.jext.org
Dernière mise à jour : 14/10/2006



 
#ProgX©2005 Mathieu GINOD - Romain GUY - Erik LOUISE