加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle的EXTRACT功能是否打破了XMLELEMENT中的NOENTITYESCAPING

发布时间:2020-12-12 13:14:39 所属栏目:百科 来源:网络整理
导读:Oracle 11g.我想通过如果我将NOENTITYESCAPING添加到 XMLELEMENT函数,它很好地关闭实体转义.但是,当我将结果传递给EXTRACT时,逃逸似乎又回来了. select xmlelement(NOENTITYESCAPING e,id,'-') from (select level as id from dual connect by level 6) XMLE
Oracle 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,'->').extract('//text()')
  from (select level as id 
          from dual 
       connect by level < 6)

XMLELEMENT(NOENTITYESCAPINGE,'->').EXTRACT('//TEXT()')
----------------------------------------------------------
1-&gt;
2-&gt;
3-&gt;
4-&gt;
5-&gt;

是否有任何修复/解决方法可以关闭转义? manual没有给出任何帮助.

解决方法

尝试使用extractvalue()函数,它取代了extract()来代替编码实体.这是一个例子:

clear screen;
column res format a20;

-- depending on a situation,NOENTITYESCAPING might be dropped

select extractvalue(
                     xmlelement(NOENTITYESCAPING e,'->'),'//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,'<')
                                             )
                                  ).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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读