2012-07-17 189 views
1

我在包含xml數據的表中有一個Clob列。 我試圖通過編寫一個查詢來提取數據:從clob列中提取xml時出錯

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:在「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聲明讀。

任何人都可以提出一種方法,我可以使它的工作?

謝謝

回答

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>