Blog ENI : Toute la veille numérique !
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée

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.

images/06EC01.png

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 ...