Oracle老师说这个数据转换程序在以后工作中要经常使用,所以叫我们写一个固定字段的数据转换.主要是了解内置包xmlParser和xmlDom的使用.程序一共分三步,
1,创建数据库表:
create table People
(
personid varchar2(10) primary key,
name varchar(20),
address varchar(60),
tel varchar(20),
fax varchar(20),
email varchar(40)
);
2,xml转表:使用内置包xmlparser和xmldom解析xml文件和构造xmldom对象.将xml文件转换数据库表.
--编写存储过程解析xml文档,并将数据插入到表中,该存储过
--程能接收输入文件参数,已知Oracle 9i的内置包
--xmlParser和xmlDom可以用来解析和读写xmlDom对象.
create or replace procedure XML2Table(path varchar2)
is
p xmlparser.parser;
doc xmldom.DOMDocument;
nl xmldom.DOMNodeList;
len number;
n xmldom.DOMNode;
nnm xmldom.DOMNamedNodeMap;
strSQL varchar2(1000);
nl2 xmldom.DOMNodeList;
len2 number;
n2 xmldom.DOMNode;
begin
p:=xmlparser.newParser; --新建解析器实例
xmlparser.parse(p,path); --解析输入的xml文件(path是xml文件地址)
doc:=xmlparser.getDocument(p); --获取解析后的文档对象
nl:=xmldom.getElementsByTagName(doc,'PERSON'); --获取Person的所有元素
len:=xmldom.getLength(nl); --获得长度
dbms_output.put_line(len);
for i in 0..len-1 --遍历所有元素
loop
strSQL:='insert into people values(';
n:=xmldom.item(nl,i);
if xmldom.getNodeName(n)='PERSON' then
nnm:=xmldom.getAttributes(n); --获取所有元素的属性
strSQL:=strSQL||''''||xmldom.getNodeValue(xmldom.item(nnm,0)) || ''''; --拼接SQL语句
end if;
nl2:=xmldom.getChildNodes(n);
len2:=xmldom.getLength(nl2);
for j in 0..len2-1 loop
n2:=xmldom.item(nl2,j);
strSQL:=strSQL || ',''' || xmldom.getNodeValue(xmldom.getFirstChild(n2))||'''';
end loop;
strSQL:=strSQL||')';
dbms_output.put_line(strSQL);
execute immediate(strSQL);
end loop;
end XML2Table;
/
exec XML2Table('E:\people.xml'); --执行存储过程,xml地址参数
3,表转xml:最后需要重新把表转换成xml
--编写存储过程把表中的记录转换成XML文档,该存储过程应---能接收输出文件参数,使用游标读取表中的记录,使用
--XMLDOM包的方法构造XMLDOM对象,然后输出到文件.
create or replace procedure Table2Xml
is
doc xmldom.DOMDocument;
docnode xmldom.DOMNode;
docelem xmldom.DOMElement;
rootnode xmldom.DOMNode;
childnode xmldom.DOMNode;
childtext xmldom.DOMText;
nodelist xmldom.DOMNodelist;
cursor cur_t2x is select * from people; --定义游标
begin
doc:=xmldom.newDOMDocument(); --创建DOMDocument文档对应模型
docnode:=xmldom.makeNode(doc); --获得文档节点
docelem:=xmldom.createElement(doc,'PEOPLE'); --创建跟元素
rootnode:=xmldom.appendChild(docnode,xmldom.makeNode(docelem)); --向文档节点加入跟节点
for peo_cur in cur_t2x --循环游标
loop
docelem:=xmldom.createElement(doc,'PERSON'); --创建Person节点
xmldom.setAttribute(docelem,'PERSONID',peo_cur.PERSONID); --获取Person节点属性
docnode:=xmldom.appendChild(rootnode,xmldom.makeNode(docelem)); --加入跟节点
docelem:=xmldom.createElement(doc,'NAME'); --创建Name节点
childnode:=xmldom.appendChild(docnode,xmldom.makenode(docelem)); --加入子元素
childtext:=xmldom.createTextNode(doc,peo_cur.NAME); --创建文本元素
childnode:=xmldom.appendChild(childnode,xmldom.makeNode(childtext)); --向子节点加入文本元素
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
docelem:=xmldom.createElement(doc,'ADDRESS');
childnode:=xmldom.appendChild(docnode,xmldom.makenode(docelem));
childtext:=xmldom.createTextNode(doc,peo_cur.ADDRESS);
childnode:=xmldom.appendChild(childnode,xmldom.makeNode(childtext));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
docelem:=xmldom.createElement(doc,'TEL');
childnode:=xmldom.appendChild(docnode,xmldom.makenode(docelem));
childtext:=xmldom.createTextNode(doc,peo_cur.TEL);
childnode:=xmldom.appendChild(childnode,xmldom.makeNode(childtext));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
docelem:=xmldom.createElement(doc,'FAX');
childnode:=xmldom.appendChild(docnode,xmldom.makenode(docelem));
childtext:=xmldom.createTextNode(doc,peo_cur.FAX);
childnode:=xmldom.appendChild(childnode,xmldom.makeNode(childtext));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
docelem:=xmldom.createElement(doc,'EMAIL');
childnode:=xmldom.appendChild(docnode,xmldom.makenode(docelem));
childtext:=xmldom.createTextNode(doc,peo_cur.EMAIL);
childnode:=xmldom.appendChild(childnode,xmldom.makeNode(childtext));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
end loop;
xmldom.writetoFile(doc,'e:\pe.xml'); --保存的地址
xmldom.freeDocument(doc);
end;
/