隨筆-14  評(píng)論-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 );

          解析并持久化的存儲(chǔ)過程代碼:
           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文檔對(duì)象
          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節(jié)點(diǎn)的值
          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   -- 釋放解析器實(shí)例
          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個(gè)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     --插入數(shù)據(jù)
          55     INSERT INTO PEOPLE VALUES (pid,name,address,tel,fax,email);
          56     COMMIT;
          57   END LOOP;
          58   -- 釋放文檔對(duì)象
          59   xmldom.freeDocument(doc);
          60   EXCEPTION
          61    WHEN OTHERS THEN
          62      DBMS_output.PUT_LINE(SQLERRM);
          63 END addPerson;


          有許多朋友都說執(zhí)行時(shí)出現(xiàn)錯(cuò)誤,現(xiàn)在我把我在Oracle9i使用的截圖貼出來,以作參考:


          存儲(chǔ)過程截圖
          posted on 2008-03-19 21:40 Jam Chan 閱讀(9569) 評(píng)論(19)  編輯  收藏 所屬分類: Oracle

          評(píng)論:
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化[未登錄] 2008-04-03 16:34 | hyq
          xmlparser.parse(xmlPar, file_path);

          ORA-29280: invalid directory path

          大哥,這個(gè)路徑怎么設(shè)置啊,我用了全路徑也報(bào)錯(cuò)了。
          用指定了的Directories也錯(cuò)  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-03 17:00 | .


          xmlparser.parse(xmlPar, file_path);
          file_path為D:\OracleTest\people.xml
          我的程序就會(huì)報(bào)無效路徑的錯(cuò)誤,請問怎么解決:-)  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-04 08:44 | Jam Chan
          @ .
          必須存在這個(gè)路徑和文件才行哦~~
          D:\OracleTest\people.xml
          如果你的xml文件放在E:\AAA\temp.xml
          file_path就應(yīng)該為E:\AAA\temp.xml  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-04 08:48 | Jam Chan
          @hyq
          路徑必須是真實(shí)存在的物理路徑,另外解析元素的時(shí)候要根據(jù)不同結(jié)構(gòu)的XML文件修改節(jié)點(diǎn)名稱和屬性名稱。
          如果文檔是如下結(jié)構(gòu):
          <?xml version="1.0"?>
          <root>
          <human>1</human>
          <human>2</human>
          <human>3</human>
          </root>
          就應(yīng)該用xmldom.getElementsByTagName( doc, 'human' );  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-07 09:28 | .
          :-(
          xmlparser.parse(xmlPar, 'C:\datafile\person.xml');
          每次調(diào)試到這里都是報(bào)ORA-29280: invalid directory path 錯(cuò)誤
          在C:\datafile 路徑里也有person.xml但還是報(bào)錯(cuò)。。。
            回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-07 10:03 | .
          xmlparser.setErrorLog(xmlPar, 'C:\datafile\xmllog.txt');
          調(diào)試倒這里也是報(bào)錯(cuò)。ORA-31020: The operation is not allowed, Reason: Not supported
          是不是要設(shè)置什么呀。這個(gè)百度里搜了下,也沒解決的。  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-07 10:08 | Jam Chan
          @ .
          可能是權(quán)限不足的問題,你用sys登陸增加權(quán)限試試:

          --首先定義一個(gè)文件目錄的別名
          CREATE DIRECTORY XmlDir AS 'C:\datafile';

          --然后在管理員權(quán)限下給用戶增加操作目錄的操作權(quán)限
          GRANT WRITE , READ ON DIRECTORY XmlDir TO SCOTT;
            回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-07 12:21 | .

          換了其他的路徑也還是不行
          可是我沒有用到directory啊,也不需要設(shè)置路徑
          權(quán)限也加了,還是不行呢
          你是怎么做的啊,就這么直接寫的啊?
          你是把路徑當(dāng)成參數(shù)寫進(jìn)去呢?  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-07 23:13 | Jam Chan
          我就是按照blog上這樣做的,沒有添加權(quán)限。
          而且在其他機(jī)器上使用也沒問題哦~~  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-10 13:45 | .
          哈哈,我又來了,我用的是oracle10g的數(shù)據(jù)庫。
          用裝xkd嗎?
          為什么我的總是報(bào)無效路進(jìn),氣死俺了~!~!
          可以把原來的那個(gè)bolg上的文章帖出來看看嘛~!~!  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-04-10 21:53 | Jam Chan
          @ .
          哈哈,你說所的blog上的文章就是我寫的這篇文章,10g我沒用過,我用的是9i版本。
          我在其他機(jī)器上測試都是9i的……暫時(shí)無法在10g上測試,實(shí)在抱歉。  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化[未登錄] 2008-04-26 17:16 | binbin
          我也試了你的過程,但也是路徑的問題,能否把你的執(zhí)行過程貼出來,我想驗(yàn)證一下我的執(zhí)行過程是否對(duì)的,謝謝!  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-05-21 22:40 | liuyi
          我在10g上用報(bào)parser不是函數(shù)或過程錯(cuò)誤!  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-05-22 10:20 | Jam Chan
          @binbin
          對(duì)不起,最近比較忙,我把截圖放在正文里了。  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-05-22 10:21 | Jam Chan
          @liuyi
          我估計(jì)9i和10g有些API的差異,許多朋友都是在10g上使用不了。解析的存儲(chǔ)過程思路應(yīng)該是我寫的邏輯,參考一下10g的API吧。  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-08-27 00:40 | 漂泊雪狼
          好東西啊!  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2008-10-28 18:23 | maggie
          請問直接解析的話說怎么做呢?要在oracle 10g里解析這個(gè)XML文件,然后要用IF-THEN-ELSE這樣的語句!  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2009-12-09 14:18 | wfjava
          不錯(cuò),挺好的,謝謝!  回復(fù)  更多評(píng)論
            
          # re: 【原創(chuàng)】編寫Oracle存儲(chǔ)過程解析XML,并把數(shù)據(jù)持久化 2012-05-08 13:11 | dudu1930
          我也遇到了權(quán)限問題。如果你的數(shù)據(jù)庫服務(wù)器不是在本機(jī),應(yīng)該是會(huì)出錯(cuò)的。因?yàn)閟p在數(shù)據(jù)庫服務(wù)器上運(yùn)行。在本地建立文件、賦權(quán)是沒有用的。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 鄯善县| 泰兴市| 金乡县| 临高县| 大足县| 广宗县| 黎城县| 玉屏| 乌苏市| 新巴尔虎右旗| 濉溪县| 内黄县| 施甸县| 临潭县| 阿坝| 凤山市| 布尔津县| 浦东新区| 林州市| 临邑县| 宝坻区| 喀喇| 从江县| 肥西县| 营口市| 甘谷县| 民权县| 玉山县| 武强县| 桂林市| 天气| 新郑市| 通榆县| 曲靖市| 辉南县| 宜黄县| 修文县| 文山县| 温泉县| 舞钢市| 信丰县|