Le parseur XML
Introduction
Le parseur (analyseur) XML permet de manipuler des fichiers XML depuis le langage PL/SQL. Il est ainsi possible de lire et de générer des fichiers au format XML. Pour pouvoir mettre en place ces éléments, le langage PL/SQL utilise le package xmldom afin de connaître et d’analyser la structure du document XML.
Le langage PL/SQL, qui est couramment utilisé par les développeurs Oracle, voit ainsi ses possibilités évoluer vers le XML. Le parseur XML pour PL/SQL a été écrit en PL/SQL et en Java. Il supporte toutes les spécifications émises par le W3C pour la norme 1.0 de XML. En plus du respect total de la norme, le parseur XML pour PL/SQL permet une analyse simplifiée du document par le respect des consignes du W3C concernant le modèle de document (DOM : Document Object Model). Il respecte également les recommandations concernant XSLT (les feuilles de style) et Xpath.
Le parseur est situé dans le répertoire $ORACLE_HOME\xdk\plsql\parser. Il est inclus en standard à partir de la version 9i.
Le schéma suivant résume simplement comment fonctionne le parseur pour l’analyse d’un document. Cette arborescence est ensuite mise en œuvre dans les exemples qui suivent afin de connaître la structure d’un document ainsi que les données contenues dans ce document.
Ainsi...
Lire un fichier XML
La première étape consiste à être capable de lire un fichier au format XML depuis le langage PL/SQL et de bien interpréter les données issues de ce fichier. Pour bien comprendre comment fonctionne le parseur, la méthode la plus simple consiste sans doute à passer par un petit programme d’exemple. Toutes les fonctionnalités du parseur ne seront pas illustrées mais à partir d’un exemple qui fonctionne, il est toujours possible de compléter les éléments manquants de façon relativement simple.
Le script suivant va donc permettre la création d’une procédure qui accepte en paramètre un nom de fichier xml et qui va l’ouvrir afin d’interpréter les données qu’il contient. xmlDom et xmlParser sont des synonymes publics des packages DBMS_XMLDOM et DBMS_XMLPARSER.
-- Cette procédure permet d'afficher les différents éléments
du document XML
create or replace procedure afficherElements(doc xmlDom.DOMDocument) is
lesNoeuds xmlDom.DOMNodeList;
longueur number;
noeud xmlDom.DOMNode;
begin
-- obtenir tous les éléments du document
lesNoeuds:=xmlDom.getElementsByTagName(doc,'*');
longueur:=xmlDom.getLength(lesNoeuds);
-- parcourir tous...
Appliquer une feuille de style à un document XML
L’un des grands avantages du langage XML est de pouvoir séparer de façon très distincte les données de la présentation, ce qu’il est plus ou moins possible de faire en HTML. L’exemple suivant, qui utilise les fonctionnalités de l’analyseur XML pour PL/SQL, va permettre de produire un fichier de sortie. xslProcessor est un synonyme public du package DBMS_XSLPROCESSOR.
set serveroutput on;
create or replace procedure appliqueXSL(
repertoire varchar2, fichierXml varchar2,
fichierXsl varchar2, fichierResultat varchar2) is
-- les variables
p xmlParser.Parser;-- l'analyseur
documentXML xmlDom.DOMDocument; -- document
noeud xmlDom.DOMNode;
---- les éléments pour la feuille de style
moteur xslProcessor.Processor;
feuilleStyle xslProcessor.Stylesheet;
documentXSL xmlDom.DOMDocument;
elementXsl xmlDom.DOMElement;
espaceNom varchar2(50);
-- les éléments pour produire le résultat
documentF xmlDom.DOMDocumentFragment;
elementF xmlDom.DomNode;
begin ...
XSU
L’API XSU (Xml SQL utility) pour PL/SQL permet la génération et le stockage de documents XML depuis et dans la base de données. Ce sont les packages DBMS_XMLQuery et DBMS_XMLSave qui permettent de mettre en œuvre ces fonctionnalités.
1. Génération de code XML avec DBMS_XMLQuery
Pour pouvoir générer un document XML qui va contenir le résultat d’une requête simple à l’aide de DBMS_XMLQuery, il est nécessaire de suivre les cinq étapes suivantes :
-
Créer un pointeur vers un contexte en appelant la méthode DBMS_XMLQuery.getCtx et en lui passant en paramètre la requête.
-
Saisir les valeurs des différents paramètres possibles de la requête à l’aide de DBMS_XMLQuery.bind.
-
Fixer les arguments optionnels comme le nom de la balise ROW ou ROWSET, le nombre de lignes à ramener...
-
Écrire les données XML dans un élément CLOB (Character LOB) à l’aide de la fonction DBMS_XMLQuery.getXML. Cette fonction peut travailler avec ou sans un fichier DTD ou un schéma.
-
Fermer le contexte.
a. Génération de code XML depuis une requête
L’exemple ci-dessous illustre de façon très simple comment générer des informations au format XML à partir de ce qui est contenu dans la base.
set serveroutput on
-- Mise au format XML du résultat d'une requête
declare
contexteRqt DBMS_XMLQuery.ctxType;
resultat CLOB;
begin
-- mise en place du contexte de requête
contexteRqt:=DBMS_XMLQuery.newContext('select * from clients');
-- obtenir le résultat
resultat:= DBMS_XMLQuery.getXML(contexteRqt);
-- afficher le résultat
afficheCLOB(resultat);
-- fermer le contexte de requête
DBMS_XMLQuery.closeContext(contexteRqt);
end;
/
Afin de faciliter l’affichage des éléments au format CLOB, la méthode afficheCLOB a été écrite.
create or replace procedure afficheClob(chaine in out nocopy CLOB) is
chaineXml varchar2(32767);
ligne varchar2(2000);
begin
-- copier le document CLOB dans un VARCHAR2 ...