2011-04-29 133 views
0

我試圖讀取使用XMLParser的包PLSQL過程一個xml讀取XML,我得到這個錯誤錯誤從PLSQL過程

 
ORA-31020: The operation is not allowed, Reason: Not supported 
ORA-06512: at "XDB.DBMS_XMLPARSER", line 395 
ORA-06512: at "SYS.DOMSAMPLE", line 75 
ORA-06512: at line 2 

DOMSAMPLE是我的程序名稱,也沒有說明是否有在行數字75,下一行包含p := xmlparser.newParser

有人可以幫我解決這個問題。或者建議一種簡單的方法來讀取plsql中的xml。

回答

0

你已經提供了很少的關於你在做什麼的細節,所以恐怕我只能猜測。

我無法重現您的錯誤消息,但我只嘗試了幾件事情。也許你錯誤地調用了Oracle XML API?也許你試圖解析的XML文檔有些奇怪嗎?恐怕我不知道,因爲您沒有給我們提供您的DOMSAMPLE程序的源代碼以及您試圖解析的XML文檔。

我不敢相信你的程序的第75行是空行。該過程的第75行還是包含該過程的文件的第75行?

以下是使用DBMS_XMLPARSERDBMS_XMLDOM的示例。它只是讀出給定的XML字符串的根元素的名稱:

SET SERVEROUTPUT ON; 

DECLARE 
    p dbms_xmlparser.parser; 
    d dbms_xmldom.domdocument; 
    e dbms_xmldom.domelement; 
BEGIN 
    p := dbms_xmlparser.newParser; 
    dbms_xmlparser.parseBuffer(p, '<thisIsATest />'); 
    d := dbms_xmlparser.getDocument(p); 
    e := dbms_xmldom.getDocumentElement(d); 
    dbms_output.put_line('Tag name is ' || dbms_xmldom.getTagName(e)); 
END; 
/

當我運行這個它給我的輸出Tag name is thisIsATest

至於更簡單的方法來讀取XML,there's one in a question I answered earlier。我不知道這是否會對你有所幫助,因爲我對你想要達到的目標知之甚少。

最後,請不要在SYS架構中創建對象。

編輯:在您的評論中,你提到你正在使用dbms_xmlparser.parse而不是dbms_xmlparser.parseBuffer。我在dbms_xmlparser.parse上玩了一次,並在最終找到有效的東西之前多次點擊相同的「無效資源句柄或路徑名」錯誤。以下是我設法工作的內容;這可能是比你想要的更好的解決方案。

在您可以使用Oracle執行任何文件I/O之前,似乎包括使用dbms_xmlparser.parse,您必須先創建一個Oracle'目錄'。 Oracle中的目錄對應於文件系統上的目錄。請注意,這是運行Oracle數據庫的計算機上的文件系統。如果XML文件不在同一文件系統上(例如,Oracle數據庫位於服務器上,並且XML文件位於開發PC上),則除非您先將該文件傳輸到目錄,否則您將無法使用dbms_xmlparser.parse在數據庫服務器的文件系統上。

我將通過創建對應於我的文件系統目錄中的Oracle目錄開始:

 
SQL> create or replace directory ora_dir as '/home/luke/ora_dir'; 

Directory created. 

我在這裏使用Linux。如果您使用Windows,請隨意扭轉斜槓的方向。

我們繼續之前,讓我們快速瀏覽一下XML文件,我們會閱讀:

 
SQL> host cat /home/luke/ora_dir/example.xml 
<?xml version="1.0" ?> 
<root> 
    <child /> 
</root> 

在SQL * Plus,host發送行的其餘部分的外殼,或cmd.exe在Windows上。在Windows上,您還可以使用type而不是cat

最後,這裏有一個PL/SQL塊讀取這個XML文件:

 
SQL> set serveroutput on 
SQL> DECLARE 
    2  p dbms_xmlparser.parser; 
    3  d dbms_xmldom.domdocument; 
    4  e dbms_xmldom.domelement; 
    5 BEGIN 
    6  p := dbms_xmlparser.newParser; 
    7  dbms_xmlparser.setBaseDir(p, 'ORA_DIR'); 
    8  dbms_xmlparser.parse(p, 'example.xml'); 
    9  d := dbms_xmlparser.getDocument(p); 
10  e := dbms_xmldom.getDocumentElement(d); 
11  dbms_output.put_line('Tag name is ' || dbms_xmldom.getTagName(e)); 
12 END; 
13/
Tag name is root 

PL/SQL procedure successfully completed. 

SQL> 

該塊,並進一步一升上來之間的唯一區別是,那個叫dbms_xmlparser.parseBuffer行已被替換兩行。這兩行中的第一行呼叫dbms_xmlparser.setBaseDir爲解析器設置基本目錄,第二行使用相對於此目錄的文件名調用dbms_xmlparser.parse

編輯2:您的代碼,這是不完全工作,你所希望的,而且你編輯成我的回答,如下:

create or replace procedure printElements(doc xmldom.DOMDocument) is 
nl xmldom.DOMNodeList; 
len number; 
n xmldom.DOMNode; 
e xmldom.DOMElement; 
nodeval varchar2(100); 
begin 
    -- get all elements 
    nl := xmldom.getElementsByTagName(doc, '*'); 
    len := xmldom.getLength(nl); 
    -- loop through elements 
    for i in 0..len-1 loop 
     n := xmldom.item(nl, i); 
     e := xmldom.makeElement(n => n); 
     dbms_output.put(xmldom.getNodeName(n) || ' '); 
     nodeval := xmldom.getNodeValue(n); 
     -- here nodeval i am getting as null, what mistake am doing? 
     dbms_output.put_line(' Value: '|| nodeval); 

    end loop; 

    dbms_output.put_line(''); 
end printElements; 

這顯然是返回所有的值正如三條意見中的最後一條所建議的那樣。

引述a previous answer of mine on a similar question

在XML DOM,元素沒有任何 '價值' 可言。元素節點包含Text節點作爲子節點,並且這些節點包含所需的值。

所以,儘量用替換線

 nodeval := xmldom.getNodeValue(n); 

 nodeval := xmldom.getNodeValue(xmldom.getFirstChild(n)); 
+0

太感謝你了,它真的幫了我... – Navin 2011-05-03 05:46:40

+0

在上面的代碼片段,你寫的東西,我我用dbms_xmlparser.parse(p,'c:/Desktop/family.xml')替換了dbms_xmlparser.parseBuffer,它給了我一個錯誤的無效資源句柄或路徑名'c:/Desktop/famil.xml'。 xml文件是 <?xml version =「1.0」?> - Sarah Bob Joanne Jim Navin 2011-05-03 06:29:46

+0

@Navin:您的XML文檔看起來不錯。查看我的編輯,查看使用'dbms_xmlparser.parse'的示例。 – 2011-05-03 22:05:34