隨筆-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 閱讀(9571) 評論(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在數據庫服務器上運行。在本地建立文件、賦權是沒有用的。  回復  更多評論
            
          主站蜘蛛池模板: 安龙县| 交口县| 荥经县| 房山区| 杭锦旗| 岫岩| 尚志市| 泾源县| 塔河县| 滕州市| 吴川市| 西华县| 原阳县| 那曲县| 临高县| 从江县| 东方市| 东丰县| 克拉玛依市| 会昌县| 白山市| 张掖市| 桂东县| 东至县| 桃园县| 百色市| 随州市| 东乡族自治县| 石景山区| 扶沟县| 中宁县| 宁都县| 津市市| 大理市| 临漳县| 金湖县| 建德市| 高密市| 固镇县| 镇赉县| 微博|