随笔-14  评论-34  文章-0  trackbacks-0
需要解析的xml文件:people.xml
 1 <?xml version="1.0"?>
 2 <PEOPLE>
 3     <PERSON PERSONID="E01">
 4         <NAME>Tony Blair</NAME>
 5         <ADDRESS>10 Downing Street, London, UK</ADDRESS>
 6         <TEL>(061) 98765</TEL>
 7         <FAX>(061) 98768</FAX>
 8         <EMAIL>blair@everywhere.com</EMAIL>
 9     </PERSON>
10     <PERSON PERSONID="E02">
11         <NAME>Bill Clinton</NAME>
12         <ADDRESS>White House, USA</ADDRESS>
13         <TEL>(001) 6400 98765</TEL>
14         <FAX>(001) 6400 98769</FAX>
15         <EMAIL>bill@everywhere.com</EMAIL>
16     </PERSON>
17     <PERSON PERSONID="E03">
18         <NAME>Tom Cruise</NAME>
19         <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
20         <TEL>(001) 4500 67859</TEL>
21         <FAX>(001) 4500 67895</FAX>
22         <EMAIL>cruise@everywhere.com</EMAIL>
23     </PERSON>
24     <PERSON PERSONID="E04">
25         <NAME>Linda Goodman</NAME>
26         <ADDRESS>78 Crax Lane, London, UK</ADDRESS>
27         <TEL>(061) 54 56789</TEL>
28         <FAX>(061) 54 56772</FAX>
29         <EMAIL>linda@everywhere.com</EMAIL>
30     </PERSON>
31 </PEOPLE>

我以scott用户为例,新建表:
1 CREATE TABLE PEOPLE
2 (
3   PERSONID VARCHAR2(4PRIMARY KEY,
4   NAME VARCHAR2(50),
5   ADDRESS VARCHAR2(200),
6   TEL VARCHAR2(20),
7   FAX VARCHAR2(20),
8   EMAIL VARCHAR2(100)
9 );

解析并持久化的存储过程代码:
 1 /**
 2 *file_path     需要解析的XML文件路径 如:D:\OracleTest\people.xml
 3 *log_path      保存日志的文件的路径  如: D:\OracleTest\xmllog.txt
 4 **/
 5 
 6 CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2)
 7 AS
 8 --//XML解析器
 9 xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;
10 --//DOM文档对象
11 doc xmldom.DOMDocument;
12 len integer;
13 personNodes xmldom.DOMNodeList;
14 chilNodes xmldom.DOMNodeList;
15 tempNode xmldom.DOMNode;
16 tempArrMap xmldom.DOMNamedNodeMap;
17 --================================
18 --以下变量用于获取XML节点的值
19 pid varchar2(4);
20 name varchar2(50);
21 address varchar2(200);
22 tel varchar2(20);
23 fax varchar2(20);
24 email varchar(100);
25 tmp integer;
26 --================================
27 BEGIN
28   xmlPar := xmlparser.newParser;
29   xmlparser.setErrorLog( xmlPar, log_path);
30   xmlparser.parse(xmlPar, file_path);
31   doc := xmlparser.getDocument( xmlPar );  
32   -- 释放解析器实例
33   xmlparser.freeParser(xmlPar);
34   -- 获取所有PERSON元素
35   personNodes := xmldom.getElementsByTagName( doc, 'PERSON' );
36   len := xmldom.getLength( personNodes );
37   --遍历所有PERSON元素
38   FOR i in 0..len-1
39   LOOP
40     --获取第i个PERSON
41     tempNode := xmldom.item( personNodes, i );
42     --所有属性
43     tempArrMap := xmldom.getAttributes(tempNode);
44     --获取PERSONID的值
45     pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'PERSONID'));
46     --获取子元素的值
47     chilNodes := xmldom.getChildNodes(tempNode);
48     tmp := xmldom.GETLENGTH( chilNodes );
49     name := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));
50     address := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));
51     tel := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 )));
52     fax := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 )));
53     email := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 )));
54     --插入数据
55     INSERT INTO PEOPLE VALUES (pid,name,address,tel,fax,email);
56     COMMIT;
57   END LOOP;
58   -- 释放文档对象
59   xmldom.freeDocument(doc);
60   EXCEPTION
61    WHEN OTHERS THEN
62      DBMS_output.PUT_LINE(SQLERRM);
63 END addPerson;


有许多朋友都说执行时出现错误,现在我把我在Oracle9i使用的截图贴出来,以作参考:


存储过程截图
posted on 2008-03-19 21:40 Jam Chan 阅读(9520) 评论(19)  编辑  收藏 所属分类: Oracle

评论:
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化[未登录] 2008-04-03 16:34 | hyq
xmlparser.parse(xmlPar, file_path);

ORA-29280: invalid directory path

大哥,这个路径怎么设置啊,我用了全路径也报错了。
用指定了的Directories也错  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-03 17:00 | .


xmlparser.parse(xmlPar, file_path);
file_path为D:\OracleTest\people.xml
我的程序就会报无效路径的错误,请问怎么解决:-)  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-04 08:44 | Jam Chan
@ .
必须存在这个路径和文件才行哦~~
D:\OracleTest\people.xml
如果你的xml文件放在E:\AAA\temp.xml
file_path就应该为E:\AAA\temp.xml  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-04 08:48 | Jam Chan
@hyq
路径必须是真实存在的物理路径,另外解析元素的时候要根据不同结构的XML文件修改节点名称和属性名称。
如果文档是如下结构:
<?xml version="1.0"?>
<root>
<human>1</human>
<human>2</human>
<human>3</human>
</root>
就应该用xmldom.getElementsByTagName( doc, 'human' );  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-07 09:28 | .
:-(
xmlparser.parse(xmlPar, 'C:\datafile\person.xml');
每次调试到这里都是报ORA-29280: invalid directory path 错误
在C:\datafile 路径里也有person.xml但还是报错。。。
  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-07 10:03 | .
xmlparser.setErrorLog(xmlPar, 'C:\datafile\xmllog.txt');
调试倒这里也是报错。ORA-31020: The operation is not allowed, Reason: Not supported
是不是要设置什么呀。这个百度里搜了下,也没解决的。  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-07 10:08 | Jam Chan
@ .
可能是权限不足的问题,你用sys登陆增加权限试试:

--首先定义一个文件目录的别名
CREATE DIRECTORY XmlDir AS 'C:\datafile';

--然后在管理员权限下给用户增加操作目录的操作权限
GRANT WRITE , READ ON DIRECTORY XmlDir TO SCOTT;
  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-07 12:21 | .

换了其他的路径也还是不行
可是我没有用到directory啊,也不需要设置路径
权限也加了,还是不行呢
你是怎么做的啊,就这么直接写的啊?
你是把路径当成参数写进去呢?  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-07 23:13 | Jam Chan
我就是按照blog上这样做的,没有添加权限。
而且在其他机器上使用也没问题哦~~  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-10 13:45 | .
哈哈,我又来了,我用的是oracle10g的数据库。
用装xkd吗?
为什么我的总是报无效路进,气死俺了~!~!
可以把原来的那个bolg上的文章帖出来看看嘛~!~!  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-04-10 21:53 | Jam Chan
@ .
哈哈,你说所的blog上的文章就是我写的这篇文章,10g我没用过,我用的是9i版本。
我在其他机器上测试都是9i的……暂时无法在10g上测试,实在抱歉。  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化[未登录] 2008-04-26 17:16 | binbin
我也试了你的过程,但也是路径的问题,能否把你的执行过程贴出来,我想验证一下我的执行过程是否对的,谢谢!  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-05-21 22:40 | liuyi
我在10g上用报parser不是函数或过程错误!  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-05-22 10:20 | Jam Chan
@binbin
对不起,最近比较忙,我把截图放在正文里了。  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-05-22 10:21 | Jam Chan
@liuyi
我估计9i和10g有些API的差异,许多朋友都是在10g上使用不了。解析的存储过程思路应该是我写的逻辑,参考一下10g的API吧。  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-08-27 00:40 | 漂泊雪狼
好东西啊!  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2008-10-28 18:23 | maggie
请问直接解析的话说怎么做呢?要在oracle 10g里解析这个XML文件,然后要用IF-THEN-ELSE这样的语句!  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2009-12-09 14:18 | wfjava
不错,挺好的,谢谢!  回复  更多评论
  
# re: 【原创】编写Oracle存储过程解析XML,并把数据持久化 2012-05-08 13:11 | dudu1930
我也遇到了权限问题。如果你的数据库服务器不是在本机,应该是会出错的。因为sp在数据库服务器上运行。在本地建立文件、赋权是没有用的。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: