Probeer extractvalue()
. te gebruiken functie, die gecodeerde entiteiten ongedaan maakt, in plaats van extract()
. Hier is een voorbeeld:
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)
Resultaat:
RES
--------------------
1->
2->
3->
4->
5->
Maar het gebruik van extractvalue()
functie kan worden beperkt door het feit dat het de waarde van slechts één knooppunt kan retourneren. In het geval van het retourneren van waarden van meerdere knooppunten de utl_i18n
pakket, en unescape_reference()
functie van dat pakket kan worden gebruikt om gecodeerde entiteiten te ontsluiten:
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;
Resultaat:
RES
--------------------
><
><
><
Ja, als utl_i18n.unescape_reference()
functie accepteert alleen waarden van varchar2
gegevenstype en typen die impliciet kunnen worden geconverteerd naar de varchar2
gegevenstype, uw handen zijn gebonden als het gaat om het verwerken van grote "strings ". In deze situatie kunt u zich wenden tot dbms_xmlgen
pakket en convert()
functie in het bijzonder, die een overbelaste versie heeft die CLOB
. kan accepteren s. Hier is een voorbeeld:
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
Resultaat:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB