IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Lecture fichier XML avec XMLDOM


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut Lecture fichier XML avec XMLDOM
    Bonjour,

    Je suis en train de lire un fichier XML constitué comme suit :

    <header>
    ...
    </header>
    <lignes>
    <ligne>
    ...
    </ligne>
    <ligne>
    ...
    </ligne>
    </lignes>

    Je me pose deux questions :

    Comment boucler spécifiquement d'un tag ligne à un autre ?

    Comment récupérer des informations spécifiques sur un tag ?
    Je m'explique :
    J'ai l'information suivante <article quantite="1">, mais quand j'utilise ma fonction getNodeName, ça ne me renvoi que article, pas le reste, comment le récupérer ?

    Voici mon code actuel, qui boucle sur tout le fichier XML.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    file_ := SYS.UTL_FILE.FOPEN (Rep , fic, 'r', 32767);
    p := SYS.XMLPARSER.newParser;
    LOOP
         SYS.UTL_FILE.GET_LINE (file_, lig);
         d_xml := d_xml || lig;
    END LOOP;
     
    SYS.XMLPARSER.parseBuffer (p, D_Xml); 
    Doc := SYS.XMLPARSER.getDocument (p);
    nl := SYS.XMLDOM.getElementsByTagName (doc, '*'); 
    len := SYS.XMLDOM.getLength (nl); 
     
    FOR i IN 0..len-1 LOOP
        n := SYS.XMLDOM.item(nl, i); 
        Nom_Tag := SYS.XMLDOM.getNodeName(n);
        n := SYS.XMLDOM.getFirstChild(n); 
        IF SYS.XMLDOM.getNodeType(n) = 3  THEN
             Val := SYS.XMLDOM.getNodeValue(n);
        END IF;
    END LOOP;
    Avec ça, aucun souci, je fais bien une lecture séquentielle du fichier.

    L'idée que j'ai eu c'est de faire une boucle dans celle de la lecture du nœud, qui bouclera d'un tag item à un autre.
    Mais je n'ai pas réussi à la mettre en œuvre, et je ne sais pas si je pars sur la bonne chose ...

    Je suis preneur de toute idée.

    Merci d'avance !

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Non ce n'est pas comme ça qu'il faut faire.

    1) Lecture du fichier xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Declare
      x_el  XmlType;
    Begin
      x_el :=  xmltype( bfilename(NomDir, NomFichRes), nls_charset_id('CHAR_CS') );
    End;
    où NomDir c'est une entité répertoire Oracle (Oracle directory), NomFichRes le nom du fichier, et CHAR_CS indique un fichier Xml encodé dans le même jeux des caractères que celui de la base. En cas des différence transmettre une valeur appropriée.

    2) Extraction des informations de la structure XML: Utilisez XMLTable avec XQuery
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
     
    SQL> 
    SQL> With Data As (
      2  Select XmlType('<?xml version="1.0" encoding="ISO-8859-1"?>
      3  <bookstore>
      4    <book category="COOKING">
      5      <title lang="en">Everyday Italian</title>
      6      <author>Giada De Laurentiis</author>
      7      <year>2005</year>
      8      <price>30.00</price>
      9    </book>
     10    <book category="CHILDREN">
     11      <title lang="en">Harry Potter</title>
     12      <author>J K. Rowling</author>
     13      <year>2005</year>
     14      <price>29.99</price>
     15    </book>
     16    <book category="WEB">
     17      <title lang="en">XQuery Kick Start</title>
     18      <author>James McGovern</author>
     19      <author>Per Bothner</author>
     20      <author>Kurt Cagle</author>
     21      <author>James Linn</author>
     22      <author>Vaidyanathan Nagarajan</author>
     23      <year>2003</year>
     24      <price>49.99</price>
     25    </book>
     26    <book category="WEB">
     27      <title lang="en">Learning XML</title>
     28      <author>Erik T. Ray</author>
     29      <year>2003</year>
     30      <price>39.95</price>
     31    </book>
     32  </bookstore>') As x_el
     33    From Dual
     34  )
     35  Select x.ligNo,
     36         x.Title,
     37         x.Lang,
     38         x.Author,
     39         To_Number(x.Price, '999D99', 'nls_numeric_characters=''. ''') Price
     40    From Data t,
     41         XmlTable('for $i in /bookstore/book
     42                   return $i
     43                  '
     44                  Passing t.x_el
     45                  Columns LigNo For ORDINAlITY,
     46                          Title     Varchar2(30) Path 'title',
     47                          Lang      Varchar2(3)  Path 'title/@lang',
     48                          Author    Varchar2(10) Path 'author[1]',
     49                          Price     Varchar2(15) Path 'price'
     50                 ) x
     51  /
         LIGNO TITLE                          LANG AUTHOR          PRICE
    ---------- ------------------------------ ---- ---------- ----------
             1 Everyday Italian               en   Giada De L         30
             2 Harry Potter                   en   J K. Rowli      29,99
             3 XQuery Kick Start              en   James McGo      49,99
             4 Learning XML                   en   Erik T. Ra      39,95
     
    SQL>
    Dans PL/SQL vous devez utiliser Select Into avec les collections pour un traitement efficace.
    De plus dans PL/SQL comme la variable x_el a été initialisée à partir du fichier vous pouvez utiliser directement XmlTable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select ...
       From XmlTable(...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    Merci pour ces informations !

    Je pensais partir sur XMLDOM parce que, n'y connaissant rien en XML (et n'étant pas non plus un expert PL/SQL), j'ai repris un truc qui existait déjà dans ma boite.

    Mais la procédure que vous m'avez montré me parait bien plus complète et plus efficace.

    J'ai mis un peu de temps à comprendre comment ça fonctionnait, mais j'ai finalement réussi à pondre un truc qui fonctionne à peu près bien (mais qui ne fait pas grand chose !)

    Voila mon code actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Declare
      x_el  XmlType;
      test varchar2(50);
    Begin
      x_el :=  xmltype( bfilename('TEMP', 'test_xml.xml'), nls_charset_id('CHAR_CS') );
     
      select NumCom into test
      from xmltable('for $i in /xmlfile/header return $i' passing x_el columns ligno for ordinality, NumCom varchar2(50) path 'NumCom') x;
     
      dbms_output.put_line(test);
    End;
    /
    Jusque là aucun souci.

    Les informations d'en-tête étant unique (une par fichier) aucun problème.
    Je devrais sans peine être en mesure de reconstituer mon en-tête de commande

    Par contre, là où j'ai des soucis, c'est pour les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Declare
      x_el  XmlType;
      test varchar2(50);
      qte number;
    Begin
      x_el :=  xmltype( bfilename('TEMP', 'test_xml.xml'), nls_charset_id('CHAR_CS') );
     
      select articleinto test
      from xmltable('for $i in /xmlfile/items/item return $i' passing x_el columns ligno for ordinality, article varchar2(50) path 'article/@quantity') x;
     
      dbms_output.put_line(test);
    End;
    /
    Pas d'erreur, mais l'output ne me renvoie rien.
    Je suppose donc que j'ai merdouillé quelque part. J'ai essayé avec d'autres champs, sans succès.

    J'en reviens donc à ce que vous m'avez dit :

    Dans PL/SQL vous devez utiliser Select Into avec les collections pour un traitement efficace.
    Sauf que je ne sais pas/vois pas comment faire. Votre avis ?

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pourriez-vous poster un exemple réduit de votre fichier XML ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    Je vous l'ai envoyé en message privée, les informations dedans n'étant pas privée, mais je préfère ne pas non plus les divulguer à n'importe qui passant sur le forum.

    Le fichier est plutôt court, donc je l'ai mis en entier.

    Merci !

Discussions similaires

  1. Lecture fichier XML avec Eclipse
    Par faloulau dans le forum Eclipse
    Réponses: 3
    Dernier message: 22/03/2011, 17h23
  2. [PHP 4] Lecture fichier XML avec PHP
    Par Oncle_Pete dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2009, 18h17
  3. [DOM] lecture fichier XML avec DOM
    Par roosse dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 09/04/2008, 13h39
  4. Réponses: 5
    Dernier message: 31/07/2007, 20h28
  5. lire et traiter un fichier XML avec XMLDOM
    Par Phiss dans le forum ASP
    Réponses: 14
    Dernier message: 13/02/2007, 17h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo