關於XML檔案內容插入Oracle資料庫的應用

2021-04-13 02:18:42 字數 3427 閱讀 6818

首先我們建立乙個儲存過程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

[email protected]

bill clinton

white house, usa

(001) 6400 98765

(001) 6400 98769

[email protected]

tom cruise

57 jumbo street, new york, usa

(001) 4500 67859

(001) 4500 67895

[email protected]

linda goodman

78 crax lane, london, uk

(061) 54 56789

(061) 54 56772

[email protected]

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 ...