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

SQL Oracle Discussion :

Lecture d'une balise dans un xml


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut Lecture d'une balise dans un xml
    Bonjour à tous les membres du Forum ,
    J'espère que vous vous portez bien.

    Je viens vers vous avec une question relative à la lecture d'un tag dans un xml.

    Mon xml est celui-ci :
    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
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <doc:form xmlns:doc="http://www...">
      <doc:SuperHeader>
        <gen:PrintInformation xmlns:gen="http://www...">
          <gen:PrInfJobName>CONTROL_STUDENT_DOCUMENT</gen:PrInfJobName>
          <gen:PrInfTimestamp>2021-09-18T18:10:00.000Z</gen:PrInfTimestamp>
          <gen:PrInfLogicalAddress>drukkerij</gen:PrInfLogicalAddress>
          <gen:PrInfArchive>true</gen:PrInfArchive>
          <gen:PrInfOutput>3</gen:PrInfOutput>
          <gen:PrInfCorrelationID>100018944090</gen:PrInfCorrelationID>
        </gen:PrintInformation>
      </doc:SuperHeader>
      <doc:Document>
        <doc:Header>
          <gen:Message xmlns:gen="http://www...">
            <gen:MessageName>P7IT</gen:MessageName>
            <gen:MessageNameDescription>Étudiants</gen:MessageNameDescription>
            <gen:MessageOrder>0</gen:MessageOrder>
            <gen:MessageVersion>3</gen:MessageVersion>
            <gen:MessageLanguage>FR</gen:MessageLanguage>
            <gen:MessageID>049714993492</gen:MessageID>
            <gen:MessageOriginalDate>2021-09-18</gen:MessageOriginalDate>
            <gen:MessageOriginalName>P7IT</gen:MessageOriginalName>
            <gen:MessageRegistered>false</gen:MessageRegistered>
            <gen:MessageDuplicate>false</gen:MessageDuplicate>
          </gen:Message>
        </doc:Header>
        <doc:RequestGeneral>
          <gen:Office xmlns:gen="http://www...">
            <gen:OfficeCode>27</gen:OfficeCode>
            <gen:OfficeName>Brussel-Bruxelles 27</gen:OfficeName>
            <gen:OfficeStreet>Rue de ...</gen:OfficeStreet>
            <gen:OfficeHouseNr>...</gen:OfficeHouseNr>
            <gen:OfficeZipcode>...</gen:OfficeZipcode>
            <gen:OfficeCity>...</gen:OfficeCity>
            <gen:OfficePhone>02-...</gen:OfficePhone>
            <gen:OfficeFax>02-...</gen:OfficeFax>
            <gen:OfficeOpen>0830</gen:OfficeOpen>
            <gen:OfficeClosed>1630</gen:OfficeClosed>
            <gen:OfficeLanguage>FR</gen:OfficeLanguage>
          </gen:Office>
          <gen:Agent xmlns:gen="http://www...">
            <gen:AgentTitle>Madame</gen:AgentTitle>
            <gen:AgentName>ST...</gen:AgentName>
            <gen:AgentFirstName>AN...</gen:AgentFirstName>
            <gen:AgentPhone>02-...</gen:AgentPhone>
            <gen:AgentNumber>00100401</gen:AgentNumber>
            <gen:AgentEmail>an...@....brussels</gen:AgentEmail>
          </gen:Agent>
          <gen:Sender xmlns:gen="http://www...">
            <gen:SenderName>It...</gen:SenderName>
            <gen:SenderFirstName/>
            <gen:SenderPhone/>
            <gen:SenderNumber/>
            <gen:SenderEmail/>
          </gen:Sender>
          <gen:Destination xmlns:gen="http://www...">
            <gen:DestinationTitleShort>Mme</gen:DestinationTitleShort>
            <gen:DestinationTitleLong>Madame</gen:DestinationTitleLong>
            <gen:DestinationName>Ci...</gen:DestinationName>
            <gen:DestinationFirstName>Ma...</gen:DestinationFirstName>
            <gen:DestinationStreet>Av...</gen:DestinationStreet>
            <gen:DestinationHouseNr>...</gen:DestinationHouseNr>
            <gen:DestinationPostBox>b...</gen:DestinationPostBox>
            <gen:DestinationZipCode>1...</gen:DestinationZipCode>
            <gen:DestinationCity>B...</gen:DestinationCity>
            <gen:DestinationCountry>B...</gen:DestinationCountry>
            <gen:AddressableId>PERSON_...</gen:AddressableId>
            <gen:DestinationINSS>81...</gen:DestinationINSS>
            <gen:DestinationEmail/>
            <gen:DestinationToTheAttentionOfTitle/>
            <gen:DestinationCorrespondenceLanguage>FR</gen:DestinationCorrespondenceLanguage>
          </gen:Destination>
          <gen:References xmlns:gen="http://www...">
            <gen:RefFileNumber>3011149</gen:RefFileNumber>
            <gen:RefInternalRef>3011149</gen:RefInternalRef>
            <gen:RefExternalRef/>
            <gen:RefSignature/>
            <gen:RefSignatureFunction/>
          </gen:References>
          <gen:Child xmlns:gen="http://www...">
            <gen:ChildName>Soumaré</gen:ChildName>
            <gen:ChildFirstName>Boub...</gen:ChildFirstName>
            <gen:ChildDateOfBirth>2003-04-02</gen:ChildDateOfBirth>
            <gen:ChildINSS>030402.....</gen:ChildINSS>
            <gen:ChildSex>1</gen:ChildSex>
            <gen:ChildChoice>false</gen:ChildChoice>
          </gen:Child>
          <gen:Period xmlns:gen="http://www...">
            <gen:PeriodStart>2021</gen:PeriodStart>
            <gen:PeriodEnd>2022</gen:PeriodEnd>
          </gen:Period>
          <gen:SuppressionDate xmlns:gen="http://www...">>2021-12-01</gen:SuppressionDate>
        </doc:RequestGeneral>
      </doc:Document>
    </doc:form>

    Mon but est de récupérer la valeur des balises PeriodStart (ligne 90) et PeriodEnd (ligne 91).
    /!\ Astuce : ces PeriodStart et PeriodEnd peuvent avoir deux formats de données : soit une année - 2021 - soit une date complète - 2021-09-01.

    Mon début de sql est celui-ci mais la requête ne renvoie rien.

    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
    WITH x AS 
    	(
    		SELECT xmltype.createxml(od.DOCUMENT_XML) xml_data
    		,dc.FILE_NUMBER AS FileN
     
    		from DOCUMENT_CONVERSATIONS dc
    		join OUTGOING_DOCUMENTS od on dc.DOCUMENT_CONVERSATION_ID = od.DOCUMENT_CONVERSATION_ID
    		join OUTGOING_DOCUMENT_COPIES odc on od.OUTGOING_DOCUMENTS_ID = odc.OUTGOING_DOCUMENTS_ID
    		where DOCUMENT_TEMPLATE in ('BHR402','BEISR402','BETN402','BM25','BRM402','BT25','BY30','E402','E403','P7A','P7INT','P9AIT','P9IT','TW_STU_RIP', 'P7IT')
    		and to_char(odc.SEND_DATE,'yyyymm') > ('202109')  
    		AND dc.FILE_NUMBER = 3011149
    	)
    SELECT xt.*
    	--, x.niss
    	--, x.FileN
    FROM x, XMLTABLE('//Period'
             PASSING x.xml_data
             COLUMNS 
                    Start_Period     		DATE PATH 	'PeriodStart',
            	End_period		DATE PATH	'PeriodEnd'
                ) xt
    ;
    Qui aurait une bonne idée pour faire avancer mon Schmilblick ?
    Merci d'avance,
    Lionel

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    J'ai toujours du mal avec le format XML, mais visiblement ce sont les : qui posent problème
    Je n'arrive pas à savoir quels sont les éléments du xml pour faire la recherche et mettre '//generiod' me fait planter la base

    Voici un moyen de contournement (pas top), remplacer les ':' avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT *
    FROM XMLTABLE ('//genPeriod'
    PASSING XMLTYPE(REPLACE('<doc:form xmlns:doc="http://www...">
      <doc:Document>
        <doc:RequestGeneral>
          <gen:Period xmlns:gen="http://www...">
            <gen:PeriodStart>2021</gen:PeriodStart>
            <gen:PeriodEnd>2022</gen:PeriodEnd>
          </gen:Period>
        </doc:RequestGeneral>
      </doc:Document>
    </doc:form>', ':'))
    COLUMNS	deb VARCHAR2(10) PATH 'genPeriodStart',
    				fin VARCHAR2(50) PATH 'genPeriodEnd');

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Après quelques recherches, faudrait utiliser NAMESPACE, mais du coup obligé de savoir quel est le lien xmlns dans le doc

    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
    SELECT *
    FROM XMLTABLE (
    		XMLNAMESPACES ('http://www.toto.com' AS "gen"),  '//gen:Period'
    PASSING XMLTYPE('<doc:form xmlns:doc="http://www.xxx.com/">
      <doc:Document>
        <doc:RequestGeneral>
          <gen:Period xmlns:gen="http://www.toto.com">
            <gen:PeriodStart>2021</gen:PeriodStart>
            <gen:PeriodEnd>2022</gen:PeriodEnd>
          </gen:Period>
        </doc:RequestGeneral>
      </doc:Document>
    </doc:form>')
    COLUMNS	deb VARCHAR2(10) PATH 'gen:PeriodStart',
    				fin VARCHAR2(50) PATH 'gen:PeriodEnd');
     
    DEB	FIN
    "2021"	"2022"

  4. #4
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Merci McM pour ces approches.
    Je commence à voir ce que tu réalises comme traitement.
    Par contre, je ne vois pas comment je vais pouvoir appliquer cette méthode sur plusieurs résultats (analyse de plusieurs xml).

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu peux sinon utiliser un truc comme décrit http://5.9.10.113/49039401/from-xml-...-in-oracle-12c

  6. #6
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Hello Mcm,

    Effectivement, mon problème se situe surtout au niveau des balises qui contiennent deux points ':'.

    Avec tes posts de 10:39' et 11:00', je n'arrive à rien. Impossible d'adapter à la lecture de mes xml.

    Par contre, avec ton post de 12:10', j'arrive à ceci :

    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
    WITH params AS 
    	(
    		SELECT xmltype.createxml(od.DOCUMENT_XML) xml_data
    		,dc.FILE_NUMBER AS FileN
    		,od.DOCUMENT_BARCODE AS Code_barres
     
    		from DOCUMENT_CONVERSATIONS dc
    		join OUTGOING_DOCUMENTS od on dc.DOCUMENT_CONVERSATION_ID = od.DOCUMENT_CONVERSATION_ID
    		join OUTGOING_DOCUMENT_COPIES odc on od.OUTGOING_DOCUMENTS_ID = odc.OUTGOING_DOCUMENTS_ID
    		where DOCUMENT_TEMPLATE in ('BHR402','BEISR402','BETN402','BM25','BRM402','BT25','BY30','E402','E403','P7A','P7INT','P9AIT','P9IT','TW_STU_RIP', 'P7IT')
    		and to_char(odc.SEND_DATE,'yyyymm') > ('202001') --changer mois et année 
    		AND dc.FILE_NUMBER = 3011149
    	)
     
     
     
    SELECT DISTINCT FileN, Code_barres, element_path, element_text
    FROM (
     
    SELECT FileN, Code_barres, element_path, element_text, attribute_name, attribute_value
    	--, x.niss
    	--, x.FileN
    FROM  params p
           CROSS JOIN
           XMLTable( 
             'for $i in $doc/descendant-or-self::* 
             return <element> 
                      <element_path>{$i/string-join(ancestor-or-self::*/name(.), ''/'')}</element_path> 
                      <element_content>{$i/text()}</element_content>
                      <element>{$i}</element>
                    </element>' 
             PASSING p.xml_data AS "doc"
             COLUMNS element_path   varchar2(4000) path '/element/element_path', 
                     element_text   varchar2(4000) path '/element/element_content',
                     element        XMLTYPE        PATH '/element/element/*'
           ) t
     
     
           LEFT OUTER JOIN
           XMLTABLE(
             '/*/@*'
             PASSING t.element
             COLUMNS attribute_name  VARCHAR2(4000) PATH 'name()',
                     attribute_value VARCHAR2(4000) PATH '.'
           ) a
           ON ( 1 = 1 )
    )
     
    WHERE 
    element_path = 'doc:form/doc:Document/doc:RequestGeneral/gen:Period/gen:PeriodStart'
    OR element_path='doc:form/doc:Document/doc:RequestGeneral/gen:Period/gen:PeriodEnd'
    ;
    Le problème que je rencontre est que les données se mettent en ligne et que je devrais alors les pivoter ; pour avoir les colonnes :
    • Dossier
    • Code-Barres
    • PeriodStart
    • PeriodEnd


    Pas trop cool. Je cherche toujours et si vous avez encore des pistes, je suis toujours preneur.
    Images attachées Images attachées  

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

Discussions similaires

  1. [XSLT 1.0] Repostionner une balise dans un fichier xml
    Par gmailex dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/04/2015, 16h46
  2. Réponses: 2
    Dernier message: 19/04/2013, 09h24
  3. [XPATH] Position d'une balise dans un XML
    Par delta07 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 17/06/2010, 12h03
  4. [LINQ to XML] Ajout d'une balise dans un xml existant
    Par Gregory.M dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 27/05/2008, 23h09

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