甲骨文 11g。我发现如果我将 NOENTITYESCAPING
添加到 XMLELEMENT
函数,它会很好地关闭实体转义。但是,当我将结果传递给 EXTRACT
时,转义似乎又回来了。
select xmlelement(NOENTITYESCAPING e,id,'->')
from (select level as id
from dual
connect by level < 6)
XMLELEMENT(NOENTITYESCAPINGE,ID,'->')
---------------------------------------
<E>1-></E>
<E>2-></E>
<E>3-></E>
<E>4-></E>
<E>5-></E>
现在,添加EXTRACT
:
select xmlelement(NOENTITYESCAPING e,id,'->').extract('//text()')
from (select level as id
from dual
connect by level < 6)
XMLELEMENT(NOENTITYESCAPINGE,ID,'->').EXTRACT('//TEXT()')
----------------------------------------------------------
1->
2->
3->
4->
5->
是否有任何修复/解决方法来保持转义关闭? manual没有帮助。
最佳答案
尝试使用 extractvalue()
函数,而不是 extract()
,它对编码的实体进行转义。这是一个例子:
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)
结果:
RES
--------------------
1->
2->
3->
4->
5->
但是 extractvalue()
函数的使用可能会受到限制,因为它只能返回一个节点的值。在返回多个节点值的情况下,utl_i18n
包和该包的 unescape_reference()
函数可用于对编码实体进行转义:
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;
结果:
RES
--------------------
><
><
><
是的,因为 utl_i18n.unescape_reference()
函数只接受 varchar2
数据类型的值以及可以隐式转换为 varchar2
的类型数据类型,当涉及到处理大型“字符串”时,您的双手束手无策。在这种情况下,您可以求助于 dbms_xmlgen
包和 convert()特别是函数,它有一个能够接受 CLOB
的重载版本。这是一个例子:
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
结果:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB
关于xml - Oracle 的 EXTRACT 函数是否打破了 XMLELEMENT 中的 NOENTITYESCAPING?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23683423/