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

XML/XSL et SOAP Discussion :

Oracle:Extraire valeur d'une balise XML


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2019
    Messages : 18
    Par défaut Oracle:Extraire valeur d'une balise XML
    Bonjour,

    J'ai un fichier XML EDI, je veux extraire des valeurs des balises avec un script oracle , comme suivant:
    je vous donne une partie du fichier, et un exemple de la valeur que je veux le récupéré

    Code XML : 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
    <?xml version="1.0" encoding="ISO-8859-15"?>
     <?xml-stylesheet type="text/xsl" href="https://one.edf.fr/sites/default/files/documents/ebxml_edf_visualiseur_v03.05.xsl"?>
     <Invoice xmlns="urn:oasis:names:specification:ubl:schemasd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schemasd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schemasd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schemasd:CommonExtensionComponents-2" xmlnssi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:specification:ubl:schemasd:Invoice-2 UBL-Invoice-2.1.xsd">
    <cbc:UBLVersionID>2.1</cbc:UBLVersionID>
    <cbc:CustomizationID schemeName="Stylesheet" schemeAgencyName="EDF" schemeID="EDF.03.05">EDF-FLX-V19.90</cbc:CustomizationID>
    <cbcrofileID>bpid:urn:oasis:names:draft:bpss:ubl-2-sbs-invoice-notification-draft</cbcrofileID>
    <cbc:ID>10096545085</cbc:ID>
    <cbc:CopyIndicator>true</cbc:CopyIndicator>
    <cbc:UUID>0d4a62e0-62d9-489a-8d08-f62ae1498135</cbc:UUID>
    <cbc:IssueDate>2019-07-03</cbc:IssueDate>
    <cbc:InvoiceTypeCode name="Facture" listName="FFA616-MDL_MONOH_19-0" listAgencyName="ELEC" listID="FEF">380</cbc:InvoiceTypeCode>
    <cbc:Note>Origine 2017 de l'électricité vendue par EDF : 85,9% nucléaire, 7,2 % renouvelables (dont 5,3% hydraulique), 1,9% charbon, 3,7% gaz, 1,3% fioul. Indicateurs d'impact environnemental sur www.edf.fr</cbc:Note>
    <cbc:Note>Document à conserver 10 ans</cbc:Note>
    <cbc:Note>Retrouvez l'ensemble de nos offres, des tarifs et autres informations sur la gestion de votre énergie sur www.edf.fr/collectivites</cbc:Note>
    <cbc:Note>Délai de préavis de résiliation du contrat : aucun pour le Tarif Bleu.</cbc:Note>
    <cbc:TaxPointDate>2019-07-03</cbc:TaxPointDate>
    <cbcocumentCurrencyCode>EUR</cbcocumentCurrencyCode>
    <cbc:TaxCurrencyCode>EUR</cbc:TaxCurrencyCode>
    <cbcaymentCurrencyCode>EUR</cbcaymentCurrencyCode>
    <cbc:LineCountNumeric>18</cbc:LineCountNumeric>
    <cac:InvoicePeriod>
    <cbc:StartDate>2019-09-03</cbc:StartDate>
    <cbcescription>Date prochaine facture</cbcescription>
    </cac:InvoicePeriod>
    <cac:BillingReference>
    <cac:AdditionalDocumentReference>
    <cbc:ID>1-DZ8-1171</cbc:ID>
    <cbc:UUID>225635703350689</cbc:UUID>
    <cbc:IssueDate>1977-10-28</cbc:IssueDate>
    <cbcocumentTypeCode>SI_2373</cbcocumentTypeCode>
    <cbcocumentType>Tarif Bleu pour clients non résidentiels Option Base 9kVA - Prix réglementés</cbcocumentType>
    </cac:AdditionalDocumentReference>
    </cac:BillingReference>
     </Invoice>
    ------------------------------------------------------------------------------------------------------------------
    les lignes que je veux récupérer avec un select (Oracle) de ce fichier:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <cbc:ID>1-DZ8-1171</cbc:ID>
     <cbc:UUID>225635703350689</cbc:UUID>
     <cbc:IssueDate>1977-10-28</cbc:IssueDate>

    pour avoir les trois valeurs
    1-DZ8-1171
    225635703350689
    1977-10-28

    Je vous remercie .

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Ceci dépend bien comment les données du xml sont chargées. Prenons un cas où les données sont stokées dans une table du type xmltype (binaire). Pour faire l'idée plus claire, cette table, dit gtt_, est crée symboliquement comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table gtt_ of XMLType
    XMLType STORE AS BINARY XML;
    On peut faire une vue façon table relationnelle par un sql avec la fonction xmltable().
    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
    select x.*
    from gtt_ t
        , xmltable(
        xmlnamespaces(
            'urn:oasis:names:specification:ubl:schemasd:Invoice-2' as "ns0"
            , 'urn:oasis:names:specification:ubl:schemasd:CommonAggregateComponents-2' as "ns1"
            , 'urn:oasis:names:specification:ubl:schemasd:CommonBasicComponents-2' as "ns2"
        )
        ,
        '/ns0:Invoice/ns1:BillingReference/ns1:AdditionalDocumentReference'
        passing t.OBJECT_VALUE
        columns
        ID  varchar2(40) path 'ns2:ID'
        , UUID varchar2(40) path 'ns2:UUID'
        , IssueDate varchar2(40) path 'ns2:IssueDate'
        ) x 
    ;
    J'ai délibérément choisi les préfixes des namespaces bien différents de ceux qui apparaîtrent dans le xml de source pour illustrer la nature arbitraire de préfixe.

    Comme ça, on voit sortir une table relationnelle. Comment l'utiliser est encore dépend. On peut faire une procédure stockée et puis interfacer la sortie par une application traditionnelle pour une base relationnelle de données. Ce serait plus éfficace comme la besogne de traîter xml est relégué au xml db (Oracle) bien dédiée à cela au lieu de le faire par l'application elle-même. Voilà !

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2019
    Messages : 18
    Par défaut Oracle:Extraire valeur d'une balise XML
    Bonjour,
    Merci pour la réponse.

    Pour répondre à votre question "Ceci dépend bien comment les données du xml sont chargées",

    je veux utiliser ce genre de requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select  Extractvalue(l.column_value,'/Invoice/ID')  REF_EXTERNE
      From (Select 
            XmlType(XMLSerialize(document xmltype(bfilename('DIRECTORY_ORACLE','MODELE_EDI.xml'), nls_charset_id('WE8ISO8859P15')))) col_xml From dual 
           ) d,
        TABLE(XMLSequence(extract(d.col_xml,'/'))) l;
        TABLE(XMLSequence(extract(value(l), '/Invoice'))) e;
    Je veux extraire les données avec la fonction EXTRACVALUE.

    J'ai essaye votre solution, mais aucune ligne n'a été récupérée, en replaçant la table gtt_ par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (Select 
            XmlType(XMLSerialize(document xmltype(bfilename('DIRECTORY_ORACLE','MODELE_EDI.xml'), nls_charset_id('WE8ISO8859P15')))) col_xml From dual 
           ) d,

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Quelle version de bdd ? Je parle de 11g+. ExtractValue() et tout ça ne sont plus d'usage encouragé. En tout cas, des xpath là sont tellement faux qu'il vaut mieux que vous étudiez les documentations de version correspondante.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2019
    Messages : 18
    Par défaut
    Je vais analyser pourquoi avec la solution proposée je récupère aucune ligne.
    la version Oracle est 11G.
    Fichier XML en pièce jointe.Pièce jointe 516140

  6. #6
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Vous pouvez créer une table gtt_ (ou quelque nom comme vous voulez) comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- drop table gtt_;
    create table gtt_ of XMLType
    XMLType STORE AS BINARY XML;
    /
    (Et dropper gtt_ après la teste, si vous voulez.)

    Et puis la charger comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into gtt_(object_value) values (
    	XMLTYPE(bfilename('DIRECTORY_ORACLE','MODELE_EDI.xml'), nls_charset_id('WE8ISO8859P15'))
    );
    Puis, c'est prêt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récuperer la valeur d'une balise XML
    Par jeromelabbe64 dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 04/02/2010, 17h30
  2. Réponses: 1
    Dernier message: 03/01/2010, 19h17
  3. Récupérer la valeur d'une balise XML
    Par mouna1 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 29/06/2009, 13h50
  4. Changer la valeur d'une balise Xml
    Par djorfe dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 24/04/2008, 10h11

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