xml - Oracle 的 EXTRACT 函数是否打破了 XMLELEMENT 中的 NOENTITYESCAPING?

标签 xml oracle oracle11g escaping extract

甲骨文 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-&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,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/

相关文章:

android - 我们如何将 Canvas 上的绘图与 Android 中的预定义图像进行比较?

oracle - 有人使用 PL/SQL Web Toolkit 吗?

sql - 在 Oracle 11g 中执行批量删除操作

c# - 获取 xelement 属性值

python - dive into python书中关于kgp.py程序的具体疑惑

android - 动态更改 xml 中定义的形状属性?

Oracle DBMS_SESSION SET_CONTEXT 不存储值

oracle - Oracle 中的 logging/nologging 选项的目的是什么

java - Oracle SQL - 在通过 JDBC 调用的查询上重用绑定(bind)变量

sql - 选择要合并到另一个查询中的静态值