> Data > Arbres XML : Pas à  pas

Arbres XML : Pas à  pas

Data - Par iTPro.fr - Publié le 24 juin 2010
email

par Julian Watson - Mis en ligne le 19/05/2004

Comment renvoyer des données sous forme de XML hiérarchique

Les bases de données relationnelles stockent souvent leurs données dans une structure arborescente ou hiérarchique, où chaque élément est associé à  un autre, selon une relation parentenfant.L'exemple le plus courant est la structure ou organigramme de direction d'une société comme celle que montre la figure 1. La hiérarchie a généralement une profondeur arbitraire et chaque élément ne contient des informations que sur sa position relative dans l'arbre. A en juger par les nombreuses questions des newsgroups, une exigence courante se dessine : utiliser SQL Server pour renvoyer la totalité de l'arbre en format XML. Par exemple, beaucoup doivent afficher une hiérarchie sur une page ou un rapport Web. La figure 2 montre un arbre affiché en mode XML.
Bien que le support XML de SQL Server 2000 soit souple, il ne permet pas de renvoyer XML hiérarchique, selon une profondeur arbitraire. Mais on peut obtenir ce résultat grâce à  la commande FOR XML EXPLICIT T-SQL.
Certaines techniques d'accès à  des données hiérarchiques par l'intermédiaire de T-SQL peuvent devenir très complexes. Cet article explique les techniques et bâtit le T-SQL en petites étapes pour en faciliter la compréhension. En cours de trajet, j'aborde des méthodes comme l'utilisation de SQL dynamique et je révèle quelques trucs et astuces, y compris comment utiliser des tables temporaires au lieu d'UNIONs dans vos instructions FOR XML EXPLICIT pour réduire la taille et la complexité de ces instructions. L'article suppose une bonne connaissance de XML sur SQL Server 2000 et l'utilisation de la table universelle.

Pour représenter une hiérarchie dans
une base de données, on utilise généralement
une table dotée d’un self
join illustrée figure 3. Dans cette table,
qui contient des informations sur
chaque employé, la colonne ReportsTo
est une clé étrangère qui pointe sur
une autre ligne dans la même table,
formant le self join. On peut raffiner
cette méthode en divisant l’information
entre deux tables, l’une contenant
l’information sur les employés et
l’autre contenant l’information sur les
relations, comme le montre la figure 4.
Le listing 1 montre un script chargé de
créer les tables et de les peupler avec
des données (par souci de simplicité,
je n’ai pas peuplé toutes les colonnes).
Pour renvoyer les données en format
XML, on utilise le mode Explicit,
en écrivant des requêtes pour produire un jeu de résultats d’un certain format.
En ajoutant la clause FOR XML EXPLICIT
à  la fin de votre requête, vous pouvez
renvoyer les résultats comme XML
plutôt que comme un recordset. Pour
créer le XML que montre la figure 2, il
faut d’abord créer une requête qui produit
le jeu de résultats illustré figure 5.
A noter que les noms de colonnes,
l’ordre des données et les données
elles-mêmes ont tous leur importance
d’un point de vue hiérarchique.
La structure de la figure 5 est dite
table universelle. Un terme trompeur
car il n’y a pas vraiment de table : il suffit
d’écrire une requête qui renvoie des
données dans ce format. Le format
table universelle est un moyen pour visualiser
la sortie de la requête demandée.
En ajoutant FOR XML EXPLICIT à 
cette requête, on produit le XML de la
figure 2. SQL Server est pointilleux sur
la structure de la table universelle. Les
noms de colonnes et l’ordre des lignes
doivent tous être corrects. Faute de
quoi, une erreur surviendra – ou pire,
la requête produira un XML de structure
incorrecte. En comparant les données
de la figure 5 au XML de la figure
2
, on commence à  voir comment
SQL Server associe les données et les
noms de colonnes à  XML.
Les colonnes Tag et Parent spéciales
contiennent des métadonnées
qui définissent la hiérarchie XML. Si
Parent est 0 ou nul, cette ligne devient
le noeud racine. Pour toutes les autres
lignes, la colonne Parent stocke le tag
du parent. L’ordre des lignes est important
ici – les enfants doivent suivre
immédiatement le parent.
Les noms des autres colonnes
contiennent aussi des métadonnées
que SQL Server utilise pour définir le
reste de la structure XML. Dans
l’exemple de la figure 5, Employee!
1!EmployeeID ajoute l’attribut
EmployeeID à  un élément nommé
Employee. Le 1 indique le numéro du
tag et assure que l’élément est placé
correctement dans la hiérarchie. La valeur
de l’attribut est la valeur de la colonne.
La colonne Employee!1!First-
Name ajoute un second attribut,
FirstName, à  l’élément Employee. Vous
en savez maintenant assez sur la table
universelle pour produire une structure
arborescente hiérarchique.

Téléchargez gratuitement cette ressource

Comment sécuriser la Digital Workplace ?

Comment sécuriser la Digital Workplace ?

Avec le recours généralisé au télétravail, les entreprises ont ouvert davantage leur SI. En dépit des précautions prises, elles ont mécaniquement élargi leur surface d’exposition aux risques. Découvrez 5 axes à ne pas négliger dans ce Top 5 Sécurité du Télétravail.

Data - Par iTPro.fr - Publié le 24 juin 2010