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 :

Contrôle de structure d'un fichier XML reçu en utilisant la DTD


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Par défaut Contrôle de structure d'un fichier XML reçu en utilisant la DTD
    Bonjour,

    Je suis en Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production et en train de développer une interface (Procédure PL/SQL) qui doit recevoir et charger des fichier XML dans la base de données.
    Mon soucis c'est le contrôle des noms des noeuds dans le fichier qui peuvent être erronés. Je veux donc implémenter dans mon code une validation de la structure via une DTD, chose que je ne sais pas le faire.
    Pourriez-vous m'aider SVP?
    Qu'est ce que je dois rajouter dans mon code ci dessous?
    Un exemple du fichier XML est attaché.
    Grand merci.exemple_xml.txt
    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
    Begin
     
      v_bfile := BFileName(Repertoire, Fichier);
      DBMS_LOB.createtemporary(v_clob, cache=>FALSE);
      DBMS_LOB.open(v_bfile, DBMS_LOB.lob_readonly);
      DBMS_LOB.loadFromFile(v_clob,v_bfile,DBMS_LOB.getLength(v_bfile));
      DBMS_LOB.close(v_bfile);
      DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT','''DD/MM/YYYY''');
     
      -- Création d'un PARSER
      v_parser := DBMS_XMLPARSER.newParser;
     
      -- On parse le document et on crée un nouveau document DOM
      DBMS_XMLPARSER.parseClob(v_parser, v_clob);
      v_doc := DBMS_XMLPARSER.getDocument(v_parser);
     
      -- On libére les ressources associées à v_clob et v_parser, comme nous n'en avons plus besoin
      DBMS_LOB.freetemporary(v_clob);
      DBMS_XMLPARSER.freeParser(v_parser);
     
      -- liste des noeuds
      v_nl := DBMS_XSLPROCESSOR.selectNodes(DBMS_XMLDOM.makeNode(v_doc),'/flux_financiers/flux_financier');  
      -- type record (1 item = 1 noeud de la liste v_nl) 
     
      FOR cur_auditeur IN 0..DBMS_XMLDOM.getLength (v_nl) - 1 LOOP
        P_NBRE_LIGNES := P_NBRE_LIGNES + 1;
        f_insert := 1; -- initialiser par defaut au mode insertion
        lerreur := 'SRUCTURE INCORRECTE DU FICHIER:';
        formule.date_create := sysdate;
        chaine.date_create := formule.date_create;
        -- on utilise la syntaxe XPATH pour affecter les valeurs des éléments
        --
        --                        DEBUT DE LECTURE DU FICHIER XML
        --
        DBMS_XSLPROCESSOR.valueOf( DBMS_XMLDOM.item(v_nl, cur_auditeur)  ,'Identification_ligne/code_ligne/text()', chaine.code_ligne);   -- varchar2(50)
        --
        DBMS_XSLPROCESSOR.valueOf( DBMS_XMLDOM.item(v_nl, cur_auditeur)  ,'Identification_agence/code_banque/text()',chaine.code_banque); -- varchar2(3)
        ..............
    Exception when others then 
        P_NMES:=sqlcode;
        verreur :=  Sqlerrm;
        P_LMES:=verreur;
        DBMS_XMLDOM.freeDocument(v_doc);
    END;

  2. #2
    Expert confirmé 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
    Par défaut
    DTD c'est vieux! Depuis un bout de temps c'est xsd. Pour cela pas besoin d'écrire du code il est possible de charger les fichiers xsd dans la base et il existe une fonction de validation du fichier XML par rapport à la structure.

  3. #3
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Par défaut
    Bonjour MNITU,
    Si tu as des exemples, je suis preneur.
    Merci.

  4. #4
    Expert confirmé 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
    Par défaut
    Pour charger/supprimer le schéma dans la base (regarder également le grant en commentaire)
    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
     
    Begin
      dbms_xmlschema.registerSchema (
        schemaURL => 'Commande.xsd',
        schemaDoc => xmltype(bfilename('ASTCMD','Commande.xsd'), nls_charset_id('WE8MSWIN1252') ),
    --    local => False, --  GRANT XDBADMIN TO <schema>;
        enableHierarchy => DBMS_XMLSCHEMA.ENABLE_HIERARCHY_NONE
      );
    End;
    /
    Begin
      dbms_xmlschema.deleteSchema (
        schemaURL => 'Commande.xsd',
        delete_option => dbms_xmlschema.DELETE_CASCADE_FORCE);
    End;  
    /
    Puis une fois le schéma chargé, un exemple de la procédure de validation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Procedure ValideSchemaCmd (
        XCmd           In  XmlType,
        NomSchema      In  Varchar2
      ) Is
        xCmdSchema                     XmlType;
      Begin
        -- creer un type local et le valider 
        xCmdSchema := XCmd.CreateSchemaBasedXml(NomSchema);
        xCmdSchema.schemaValidate();
      End;
    Je me rappel d'avoir beaucoup utilisé la doc d'Oracle "XML DB Developer's Guide"

Discussions similaires

  1. Obtention de la structure d'un fichier XML dans tXMLMap
    Par ableur dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 11/05/2015, 11h26
  2. Réponses: 2
    Dernier message: 30/11/2014, 17h30
  3. Modification de la structure d'un fichier XML
    Par Alphacom dans le forum VB.NET
    Réponses: 5
    Dernier message: 08/08/2014, 11h23
  4. [JSON] Lire structure JSON dans fichier XML
    Par Mister Nono dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 01/04/2013, 13h04
  5. [XML] Structure d'un fichier XML
    Par Sytchev3 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/05/2012, 10h32

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