Bonjour,
Je viens de créer trois procédures pour la lecture d'un fichier XML par PL/SQL
sous oracle 10g.
======== la procedure N° 1 ==================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| create or replace procedure afficherElement(doc xmlDom.DOMDocument) is
lesNoeuds xmlDom.DOMNodeList;
longueur number;
noeud xmlDom.DOMNode;
begin
---- obtenir tous les elements du document
lesNoeuds := xmlDom.getElementsByTagName(doc,'*');
longueur := xmlDom.getLength(lesNoeuds);
---- parcourir tous les elements à l'aide d'une boucle
for i in 0 .. longueur - 1
loop
noeud := xmlDom.item(lesNoeuds,i);
dbms_output.put(xmlDom.getNodeName(noeud) ||' ');
end loop;
---- passer à la ligne suivante
dbms_output.put_line (' ');
end; |
=============== la procedure N° 2 ================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| create or replace procedure afficherAttributs(doc xmlDom.DOMDocument) is
lesNoeuds Xmldom.DOMNodeList;
lg1 number;
lg2 number;
noeud xmlDom.DOMNode;
element Xmldom.DOMElement;
lesAttributs xmldom.DOMNamedNodeMap;
nomAttr varchar2(100);
valeurAttr varchar2(100);
begin
--- obtenir tous les elements
lesNoeuds := xmlDom.getElementsByTagName(doc,'*');
lg1 := xmlDom.getLength(lesNoeuds);
--- parcourir tous les elements
for i in 0 .. lg1 - 1
loop
noeud := xmldom.item(lesNoeuds , i);
element := xmldom.makeElement(noeud);
--- nom de la balise
dbms_output.put_line(xmldom.getTagName(element) || ':');
--- obtenir tous les attributs de cet element
lesAttributs := xmldom.getAttributes(noeud);
if (xmldom.isNull(lesAttributs)= FALSE)
then
lg2 := xmldom.getLength(lesAttributs);
--- parcourir tous les attributs
for j in 0 .. lg2 - 1
loop
noeud := xmldom.item(lesAttributs , j);
nomAttr := xmldom.getNodeName(noeud);
valeurAttr := xmldom.getNodeValue(noeud);
dbms_output.put(' '|| nomAttr || '='||valeurAttr);
end loop;
dbms_output.put_line (' ');
end if;
end loop;
end; |
=============== la procedure N° 3 ==============
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| create or replace procedure lirexml(
repertoire in varchar2,
fichier in varchar2,
fichier_erreur in varchar2 )
is
p xmlparser.Parser;
doc xmldom.DOMDocument;
begin
-- nouveau parser
p := xmlparser.newParser;
--- fixer quelques caracteristiques du parser
XMLDOM.SetVersion(doc,'1.0');
XMLDOM.SetCharSet(doc,'UTF-8');
xmlparser.setValidationMode(p,FALSE);
xmlparser.setErrorLog(p,repertoire||'\'||fichier_erreur);
xmlparser.setBaseDir(p,repertoire);
--- analyser le fichier XML
xmlparser.parse(p,repertoire||'\'||fichier);
--- obtenir le document
doc := xmlparser.getDocument(p);
--- afficher les differents elements
dbms_output.put_line('les elements du documents sont : ');
afficherelement(doc);
--- afficher les attributs de chaque element
dbms_output.put_line('les attributs des elements sont : ');
afficherattributs(doc);
--- liberer le document
xmldom.freeDocument(doc);
--- liberer le parser
xmlparser.freeParser(p);
end; |
========= pour la complitation pas des problemes =====
au moment de l’exécution :
execute lireXml('C:\mecasoft\oracle_xml','equipe.xml','erreur.txt');
Le message suivant s'affiche :
ERROR at line 1:
ORA-31020: The operation is not allowed, Reason: Not supported
ORA-06512: at "XDB.DBMS_XMLPARSER", line 395
ORA-06512: at "SALEM.LIREXML", line 15
ORA-06512: at line 1
============= mon fichier equipe.xml ======
<?xml version="1.0" standalone="no" encoding="UTF-8"?>
<!DOCTYPE equipe SYSTEM "equipe.dtd">
<equipe nom="US POSTAL" pays ="USA">
<coureur numero="001"> SALEM </coureur>
<coureur numero="002"> NEJIB </coureur>
<coureur numero="003"> HAMZA </coureur>
<coureur numero="004"> KHALED </coureur>
<coureur numero="005"> BECHIR </coureur>
<coureur numero="006"> ALI </coureur>
<coureur numero="007"> MOHAMED </coureur>
<coureur numero="008"> FAOUZI </coureur>
</equiipe>
Partager