如何在XMLTYPE中获取&符号值

问题描述 投票:0回答:3

我有以下查询:

select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1v2</val>
  </TPL>
</root>') from dual;

当我执行上面的查询,它执行完全正常,我得到以下输出:

<root>
  <TPL>
    <fld>f7</fld><val>v1v2</val>
  </TPL>
</root>

但是当我执行以下(这是我的要求)时:

select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1&v2</val>
  </TPL>
</root>') from dual;

我被要求在弹出屏幕中输入'&'的值。

我尝试了以下两种方式:

select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1&amp;v2</val>
  </TPL>
</root>') from dual;


select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1''&''v2</val>
  </TPL>
</root>') from dual;

但是仍然无法正确获取OUTPUT:

<root>
  <TPL>
    <fld>f7</fld><val>v1&v2</val>
  </TPL>
</root>

我怎样才能实现这一目标?

oracle plsql xmltype
3个回答
1
投票

这里有两个问题 - &是Oracle SQL和XML中的一个特殊字符,它必须在两者中进行转义。 cdb_dba给出了一些如何在SQL中对它进行转义的例子(CHR(38)或者在字符串的末尾),mkuligowski给出了如何在XML(&amp;或CDATA)中转义它的示例,但这两种转义需要合并。这里有几个例子:

-- with CHR() + CDATA
select XMLType('<root>
  <TPL>
    <fld>f7</fld><val><![CDATA[v1'|| chr(38) || 'v2]]></val>
  </TPL>
</root>') from dual;

-- with ampersand at the end of a string + "amp" character reference 
select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1&' || 'amp;v2</val>
  </TPL>
</root>') from dual;

0
投票

而不是使用v1''&''v2v1&amp;v2,尝试使用v1'|| chr(38) || 'v2'v1 &'||'v2'

chr(38)是&符号的ASCII,第二个选项只是一种不同的连接方法。希望这可以帮助!


0
投票

我打赌你在查询时使用的是SQLDeveloper。尝试运行SET DEFINE OFF;,系统不会提示您输入值。

此外,当您创建XMLType对象时,您应该转义非法字符,因此以下将工作:

SET DEFINE OFF;
select XMLType('<root>
 <TPL>
  <fld>f7</fld><val>v1&amp;v2</val>
 </TPL>
 </root>') from dual;

另一方面,你总是可以在CDATA中包装非法字符:

select XMLType('<root>
 <TPL>
  <fld>f7</fld><val><![CDATA[v1&v2]]></val>
 </TPL>
</root>') from dual;
© www.soinside.com 2019 - 2024. All rights reserved.