Essayez d'utiliser extractvalue()
fonction, qui déséchappe les entités encodées, au lieu de extract()
. Voici un exemple :
clear screen;
column res format a20;
-- depending on a situation, NOENTITYESCAPING might be dropped
select extractvalue(
xmlelement(NOENTITYESCAPING e,id,'->')
, '//text()'
) as res
from (select level as id
from dual
connect by level < 6)
Résultat :
RES
--------------------
1->
2->
3->
4->
5->
Mais l'utilisation de extractvalue()
La fonction peut être limitée par le fait qu'elle ne peut renvoyer la valeur que d'un seul nœud. Dans le cas du retour de valeurs de plusieurs nœuds, le utl_i18n
package et unescape_reference()
La fonction de ce package peut être utilisée pour démasquer les entités encodées :
clear screen;
column res format a20;
select utl_i18n.unescape_reference(xmlelement(root
, xmlelement(node1, '>')
, xmlelement(node2, '<')
).extract('//text()').getstringval()
) as res
from dual
connect by level <= 3;
Résultat :
RES
--------------------
><
><
><
Oui, comme utl_i18n.unescape_reference()
la fonction n'accepte que les valeurs de varchar2
type de données et types pouvant être implicitement convertis en varchar2
type de données, vos mains sont liées lorsqu'il s'agit de traiter de grandes "chaînes ". Dans cette situation, vous pouvez vous tourner vers dbms_xmlgen
package et convert()
fonction en particulier, qui a une version surchargée capable d'accepter CLOB
s. Voici un exemple :
select dbms_xmlgen.convert(
xmlagg(xmlelement(root
, xmlelement(node1, '>')
, xmlelement(node2, '<')
)
).extract('//text()').getclobval()
, 1) as res
from dual
connect by level <= 3000; -- 1 (second parameter of the convert() function)
-- instructs function to decode entities
Résultat :
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB