你已經提供了很少的關於你在做什麼的細節,所以恐怕我只能猜測。
我無法重現您的錯誤消息,但我只嘗試了幾件事情。也許你錯誤地調用了Oracle XML API?也許你試圖解析的XML文檔有些奇怪嗎?恐怕我不知道,因爲您沒有給我們提供您的DOMSAMPLE
程序的源代碼以及您試圖解析的XML文檔。
我不敢相信你的程序的第75行是空行。該過程的第75行還是包含該過程的文件的第75行?
以下是使用DBMS_XMLPARSER
和DBMS_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));
太感謝你了,它真的幫了我... – Navin 2011-05-03 05:46:40
在上面的代碼片段,你寫的東西,我我用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
@Navin:您的XML文檔看起來不錯。查看我的編輯,查看使用'dbms_xmlparser.parse'的示例。 – 2011-05-03 22:05:34