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 :

Ajouter un namespace à un XMLTYPE


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Par défaut Ajouter un namespace à un XMLTYPE
    Bonjour à tous,

    J'ai un xml de départ :

    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
     
    <element ref="AETITLE" sn="4496" unit="texte" type="char" default-type="combobox" xmlns="http://www.eppocratic.com/xml-definition/1.0">
    	<label>AETITLE</label>
    	<e>
    		<JUniversGrid/>
    	</e>
    	<XEditorValue>
    		<JUniversGrid>
    			<RequestBinding>
    				<Request connectionSId="gips">
    					<Source entitySId="Rub:AETITLE" mainSource="true"/>
    				</Request>
    				<Order implementationSId="code"/>
    			</RequestBinding>
    			<Component bind="code"/>
    		</JUniversGrid>
    	</XEditorValue>
    	<option>Radio</option>
    </element>
    et j'aimerais simplement extraire le noeud <XEditorValue> (+ les noeuds fils) et rajouter un namespace à cette balise <XEditorValue> pour au final avoir ce xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<XEditorValue xmlns="http://www.eppocratic.com/xml-definition/1.0">
    		<JUniversGrid>
    			<RequestBinding>
    				<Request connectionSId="gips">
    					<Source entitySId="Rub:AETITLE" mainSource="true"/>
    				</Request>
    				<Order implementationSId="code"/>
    			</RequestBinding>
    			<Component bind="code"/>
    		</JUniversGrid>
    	</XEditorValue>

    J'ai essayé ceci (script avec sortie OWA) :

    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
    DECLARE
      d dbms_xmldom.DOMDocument;
    	dn dbms_xmldom.DOMElement;
      xml XMLTYPE;
     
      l_clob clob;  
      l_len PLS_INTEGER := 255;
      l_idx PLS_INTEGER := 1;
     
    BEGIN
     
      xml := XMLTYPE('<element ref="AETITLE" sn="4496" unit="texte" type="char" default-type="combobox" xmlns="http://www.eppocratic.com/xml-definition/1.0">
    	<label>AETITLE</label>
    	<e>
    		<JUniversGrid/>
    	</e>
    	<XEditorValue>
    		<JUniversGrid>
            <RequestBinding>
    						<Request connectionSId="gips">
    							<Source entitySId="Rub:AETITLE" mainSource="true"/>
    						</Request>
    						<Order implementationSId="code"/>
            </RequestBinding>
            <Component bind="code"/>
    		</JUniversGrid>
    	</XEditorValue>
    	<option>Radio</option>
    </element>');
     
      xml := DP_STUDIO_EXPORT.removeNS(xml);
      select extract(xml,'element/XEditorValue') into xml from dual;
     
      d := dbms_xmldom.newDOMDocument(xml);
    	dn := dbms_xmldom.getDocumentElement(d); 
    	dbms_xmldom.setAttribute(dn,'xmlns','http://www.monnamespace.com/definition');
     
      l_clob := xml.getClobVal();    
     
      -- OUTPUT RESULTS
      owa_util.mime_header('application/xml', false);
      owa_util.http_header_close;
      for i in 1..ceil(dbms_lob.getlength(l_clob)/l_len) loop
        htp.prn(substr(l_clob,l_idx,l_len));
        l_idx := l_idx + l_len;
      end loop; 
     
    END;
    Mais le résultat est louche, il me met 2 fois l'attribut xmlns pour la balise <XEditorValue> (une fois vide et une fois correct) et également un attribut xmlns vide pour la balise <JUniversGrid>


    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <XEditorValue xmlns="" xmlns="http://www.monnamespace.com/definition">
    	<JUniversGrid xmlns="">
    		<RequestBinding>
    			<Request connectionSId="gips">
    				<Source entitySId="Rub:AETITLE" mainSource="true"/>
    			</Request>
    			<Order implementationSId="code"/>
    		</RequestBinding>
    		<Component bind="code"/>
    	</JUniversGrid>
    </XEditorValue>
    Qqun peut-il m'aider svp ?

    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En fait vous vous embêtez pour rien, vous devez préciser le namespace lors de l'appel à la fonction Extract et il le redescend sur le nouveau nœud :

    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
    With Donnees as
    (
    select XMLTYPE(
    '<element ref="AETITLE" sn="4496" unit="texte" type="char" default-type="combobox" xmlns="http://www.eppocratic.com/xml-definition/1.0">
        <label>AETITLE</label>
        <e>
            <JUniversGrid/>
        </e>
        <XEditorValue>
            <JUniversGrid>
            <RequestBinding>
                            <Request connectionSId="gips">
                                <Source entitySId="Rub:AETITLE" mainSource="true"/>
                            </Request>
                            <Order implementationSId="code"/>
            </RequestBinding>
            <Component bind="code"/>
            </JUniversGrid>
        </XEditorValue>
        <option>Radio</option>
    </element>') as xml
      from dual
    )
    select extract(xml,'/element/XEditorValue', 'xmlns="http://www.eppocratic.com/xml-definition/1.0') as new_xml
      from Donnees;
     
    NEW_XML
    --------------------------------------------------------------------
    <XEditorValue xmlns="http://www.eppocratic.com/xml-definition/1.0">
      <JUniversGrid>
        <RequestBinding>
          <Request connectionSId="gips">
            <Source entitySId="Rub:AETITLE" mainSource="true"></Source>
          </Request>
          <Order implementationSId="code"></Order>
        </RequestBinding>
        <Component bind="code"></Component>
      </JUniversGrid>
    </XEditorValue>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Par défaut
    Merci mais j'ai oublié un détail important :

    J'ai comme contrainte de devoir faire l'extract AVANT.

    Autrement dit, il faut considérer l' XML original sans namespace et quand je fais :

    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
     
    WITH Donnees AS
    (
    SELECT XMLTYPE(
    '<element ref="AETITLE" sn="4496" unit="texte" type="char" default-type="combobox">
        <label>AETITLE</label>
        <e>
            <JUniversGrid/>
        </e>
        <XEditorValue>
            <JUniversGrid>
            <RequestBinding>
                            <Request connectionSId="gips">
                                <Source entitySId="Rub:AETITLE" mainSource="true"/>
                            </Request>
                            <Order implementationSId="code"/>
            </RequestBinding>
            <Component bind="code"/>
            </JUniversGrid>
        </XEditorValue>
        <option>Radio</option>
    </element>') AS xml
      FROM dual
    )
    SELECT extract(xml,'/element/XEditorValue', 'xmlns="http://www.eppocratic.com/xml-definition/1.0') AS new_xml
      FROM Donnees;
     
    NEW_XML
    --------------------------------------------------------------------
    null
    Il renvoie null évidemment donc le probleme est d'extraire le noeud <XEditorValue> et de lui ajouter un namespace avec un XML de départ qui n'a pas de namespace...

    Une idée ?

    Merci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    La solution suivante est un peu bricolée mais fonctionne.

    On rajoute une balise maître (je l'ai appelée toto) avec le bon namespace, puis on fait l'extraction ensuite :
    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
    WITH Donnees AS
    (
    SELECT XMLTYPE(
    '<element ref="AETITLE" sn="4496" unit="texte" type="char" default-type="combobox">
        <label>AETITLE</label>
        <e>
            <JUniversGrid/>
        </e>
        <XEditorValue>
            <JUniversGrid>
            <RequestBinding>
                            <Request connectionSId="gips">
                                <Source entitySId="Rub:AETITLE" mainSource="true"/>
                            </Request>
                            <Order implementationSId="code"/>
            </RequestBinding>
            <Component bind="code"/>
            </JUniversGrid>
        </XEditorValue>
        <option>Radio</option>
    </element>') AS xml
      FROM dual
    )
    SELECT extract(
            XMLElement("toto", XMLAttributes('http://www.eppocratic.com/xml-definition/1.0' as "xmlns"), xml),
            '/toto/element/XEditorValue',
            'xmlns="http://www.eppocratic.com/xml-definition/1.0"'
            ) AS new_xml
      FROM Donnees;

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Par défaut
    Merci pour cette solution (qui est un peu du bricolage il est vrai).

    J'aurais pu faire ceci (mais je ne peux pas car je suis sur Oracle 10g1) :

    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
     
    with t as (
     select xmltype('<element ref="AETITLE" sn="4496" unit="texte" type="char" default-type="combobox">
    <label>AETITLE</label>
    <e>
    <JUniversGrid/>
    </e>
    <XEditorValue>
    <JUniversGrid>
    <RequestBinding>
    <Request connectionSId="gips">
    <Source entitySId="Rub:AETITLE" mainSource="true"/>
    </Request>
    <Order implementationSId="code"/>
    </RequestBinding>
    <Component bind="code"/>
    </JUniversGrid>
    </XEditorValue>
    <option>Radio</option>
    </element>') xml from dual
    )
    select extract(
             insertchildxml( xml, 
                             '/element/XEditorValue',
                             '@xmlns',
                             'http://www.eppocratic.com/xml-definition/1.0' )
           , '/element/*:XEditorValue'
           )  
    from t
    ;

Discussions similaires

  1. ajout de namespace avec jaxb
    Par totomimi dans le forum Persistance des données
    Réponses: 0
    Dernier message: 21/07/2009, 10h59
  2. Comment ajouter un namespace à vb.net?
    Par libree dans le forum VB.NET
    Réponses: 1
    Dernier message: 01/05/2009, 16h57
  3. Ajouter plusieurs Namespace dans une balise
    Par Mumux dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/11/2008, 17h29
  4. Ajouter des namespace dans un fichier XML
    Par Septembre84 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/05/2008, 12h20
  5. Réponses: 1
    Dernier message: 30/05/2007, 20h12

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