首先我們建立乙個儲存過程domsample,並且在oracle資料庫中建立乙個表people,另外新建乙個people.xml檔案及people.dtd檔案,
新建表的sql語句如下:
create table people
( id varchar2(10) primary key,
name varchar2(20),
address varchar2(60),
tel varchar2(20),
fax varchar2(20),
email varchar2(40)
); people.xml檔案內容如下:
<?xml version="1.0"?>
tony blair
10 downing street, london, uk
(061) 98765
(061) 98768
bill clinton
white house, usa
(001) 6400 98765
(001) 6400 98769
tom cruise
57 jumbo street, new york, usa
(001) 4500 67859
(001) 4500 67895
linda goodman
78 crax lane, london, uk
(061) 54 56789
(061) 54 56772
people.dtd檔案內容如下:
<?xml version="1.0" encoding="utf-8"?>
儲存過程語句如下:
create or replace procedure domsample(dir varchar2, inpfile varchar2,
errfile varchar2) is
-- 引數說明:
-- dir 基本目錄,如 'd:/xml/plsql'
-- inpfile 輸入檔名,不含路徑,如 'people.xml'
-- errfile 錯誤日誌檔案,儲存解析錯誤資訊, 如 'err.log'
p xmlparser.parser;
doc xmldom.domdocument;
procedure xmlinserttable(doc xmldom.domdocument) is
nl xmldom.domnodelist;
len number;
len2 number;
n xmldom.domnode;
nnm xmldom.domnamednodemap;
attrname varchar2(100);
attrval varchar2(100);
strsql varchar2(20000);
attn xmldom.domnode;
nl2 xmldom.domnodelist;
begin
nl := xmldom.getelementsbytagname(doc, 'person'); -- 讀取 person 元素
len := xmldom.getlength(nl);
-- 遍歷元素
for i in 0..len-1 loop
strsql := 'insert into people values ('; -- 構造動態 sql 語句
n := xmldom.item(nl, i);
if xmldom.getnodename(n)='person' then
nnm := xmldom.getattributes(n); -- 讀取 id 屬性
attn := xmldom.item(nnm, 0);
strsql := strsql || '''' || xmldom.getnodevalue(attn) || '''';
end if;
-- 讀取 person 的子節點
nl2 := xmldom.getchildnodes(n);
len2 := xmldom.getlength(nl2);
-- 處理 name, address, ... 等節點
for j in 0..len2-1 loop
n := xmldom.item(nl2, j);
strsql := strsql || ', ''' || xmldom.getnodevalue(xmldom.getfirstchild(n)) || '''';
end loop;
strsql := strsql || ')'; -- 完成 動態 sql 語句的構造
-- 執行插入記錄的 sql 語句
execute immediate(strsql); -- 執行動態 sql
end loop;
commit; -- 提交插入
end xmlinserttable;
begin
-- 新建解析器例項
p := xmlparser.newparser;
-- 設定解析器特性
xmlparser.setvalidationmode(p, true); -- 是否使用文件指定的dtd驗證文件合法性
xmlparser.seterrorlog(p, dir || '/' || errfile); -- 設定錯誤日誌檔案
xmlparser.setbasedir(p, dir); -- 設定基本目錄
-- 解析輸入的xml檔案
xmlparser.parse(p, dir || '/' || inpfile);
-- 獲取解析後的文件物件
doc := xmlparser.getdocument(p);
-- 釋放解析器例項
xmlparser.freeparser(p);
dbms_output.put_line('插入資料中...');
xmlinserttable(doc);
-- 釋放文件物件
xmldom.freedocument(doc);
最後我們就可以呼叫儲存過程了.可以在plsql developer用以下方法呼叫:
exec domsample('d:/xml/plsql','people.xml','err.log');
必須注意的是:在d:/xml/plsql目錄下必須有people.xml檔案及people.dtd檔案.
希望這篇文章能對初學者有所幫助!!!
如何讀取XML檔案內容
下面是通過讀取xml檔案中的內容並顯示在textbox的例子 以下是引用片段 using system using system.data using system.configuration using system.web using system.web.security using syst...
批量改寫xml檔案內容
略 xml.etree.elementtree 簡稱et xml.etree.elementtree模組實現了乙個簡單而高效的api用於解析和建立xml資料。實際上,xml.etree.elementtree可以用於處理任何樹結構的資料,但最常用於處理xml文件。1 匯入et 兩種匯入方式 impo...
記錄讀取xml檔案內容
記錄下使用document類去讀取xml檔案內容 xml內容 1 xml version 1.0 encoding utf 8 2 schools 3 school id 1 name school1 4 class id 11 name class11 5 student id 111 name ...