从clob列中提取xml时出错

时间:2012-07-17 21:40:44

标签: xml oracle11g

我在包含xml数据的表中有一个Clob列。 我尝试通过编写查询来提取数据:

select XMLTYPE.createxml(e.cdxml_index).extract('//page/fragment/text()') from chemical_structures e where e.primary_key=20;

我得到的错误信息是:

错误报告: SQL错误:ORA-31020:不允许该操作,原因:出于安全原因,服务器端不允许通过XDB存储库进行ftp和http访问 ORA-06512:at" SYS.XMLTYPE",第5行 31020. 00000 - "不允许操作,原因:%s" *原因:不允许尝试操作 *行动:查看原因并更改为有效的操作。

clob列中的数据如下:

(CLOB) <?xml version="1.0"  ?>
<!DOCTYPE CDXML SYSTEM "http://www.***.com/xml/cdxml.dtd" >
<CDXML
 <page
 id="12"
 BoundingBox="0 0 540 719.75"
><fragment
 id="9"
 BoundingBox="91.5 111.75 104.01 123.21"
><n
id="8"
p="94.94 117.6"
Z="2"
Element="35"
NumHydrogens="0"
Charge="-1"
AS="N"
><t
id="7"
p="91.5 121.5"
BoundingBox="91.5 111.75 104.01 123.21"
><s font="3" size="10" face="96">Br-</s></t></n></fragment></page></CDXML>

我在一个与xml中的DOCTYPE声明有关的论坛上阅读。

任何人都可以提出一种方法来让它发挥作用吗?

由于

1 个答案:

答案 0 :(得分:3)

我找到了解决方法。

我不得不禁用xml dtd验证,但在尝试了各种讨论板上提到的一些内容之后,这种方法没有用。

最后我决定忽略xml中的doctype声明。为此,我使用了REGEXP_REPLACE方法。

以下查询给了我正在寻找的内容:

select extract(XMLTYPE(REGEXP_REPLACE(e.cdxml_index, '<!DOCTYPE CDXML SYSTEM "http://***/xml/cdxml.dtd" >', '')),'//page/fragment/n') from chemical_structures e where e.primary_key=20;

我得到以下输出:

<n
id="8"
p="94.94 117.6"
Z="2"
Element="35"
NumHydrogens="0"
Charge="-1"
AS="N"
><t
id="7"
p="91.5 121.5"
BoundingBox="91.5 111.75 104.01 123.21"
><s font="3" size="10" face="96">Br-</s></t></n>