Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2011, 21h32   #1
Invité régulier
 
Inscription : novembre 2006
Messages : 37
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 37
Points : 8
Points : 8
Par défaut Ajouter un namespace à un XMLTYPE

Bonjour à tous,

J'ai un xml de départ :

Code :
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 :
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 :
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 :
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
fcjunic est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/01/2011, 11h29   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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>
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 16h42   #3
Invité régulier
 
Inscription : novembre 2006
Messages : 37
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 37
Points : 8
Points : 8
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 :
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
fcjunic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 18h47   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 09h54   #5
Invité régulier
 
Inscription : novembre 2006
Messages : 37
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 37
Points : 8
Points : 8
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 :
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
;
fcjunic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h48.


 
 
 
 
Partenaires

Hébergement Web