Versuchen Sie, extractvalue()
zu verwenden anstelle von extract()
. Hier ist ein Beispiel:
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)
Ergebnis:
RES
--------------------
1->
2->
3->
4->
5->
Aber die Verwendung von extractvalue()
Die Funktion kann durch die Tatsache eingeschränkt sein, dass sie nur den Wert eines Knotens zurückgeben kann. Im Fall der Rückgabe von Werten mehrerer Knoten wird utl_i18n
Paket und unescape_reference()
Funktion dieses Pakets kann verwendet werden, um verschlüsselte Entitäten aufzuheben:
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;
Ergebnis:
RES
--------------------
><
><
><
Ja, als utl_i18n.unescape_reference()
Die Funktion akzeptiert nur Werte von varchar2
Datentyp und Typen, die implizit in varchar2
konvertiert werden können Datentyp sind Ihnen die Hände gebunden, wenn es um die Verarbeitung großer "Strings geht ". In dieser Situation können Sie sich an dbms_xmlgen
wenden Paket und convert()
Funktion, die eine überladene Version hat, die CLOB
akzeptieren kann s. Hier ist ein Beispiel:
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
Ergebnis:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB