使用PLSQL開發(fā)人員如何解析XML文件(原創(chuàng))_第1頁
使用PLSQL開發(fā)人員如何解析XML文件(原創(chuàng))_第2頁
使用PLSQL開發(fā)人員如何解析XML文件(原創(chuàng))_第3頁
使用PLSQL開發(fā)人員如何解析XML文件(原創(chuàng))_第4頁
使用PLSQL開發(fā)人員如何解析XML文件(原創(chuàng))_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、使用PL/SQL程序如何解析XML(原創(chuàng))學(xué)習(xí)篇-XML文件解析文檔作者:Siman.He < 賀斌 >MSN : Simanhe_1創(chuàng)建日期:2009-5-22更新日期:2009-5-22文檔編號:<Document Reference Number>當(dāng)前版本:Draft 1.0Note: Title, Subject, Last Updated Date, Reference Number, and Version are marked by a Word Bookmark so that they can be easily reproduced in the h

2、eader and footer of documents. When you change any of these values, be careful not to accidentally delete the bookmark. You can make bookmarks visible by selecting Tools->OptionsView and checking the Bookmarks option in the Show region.文檔控制變更記錄3日期作者版本變更說明07/04/08IBM1.0初版審閱姓名職位分發(fā)拷貝編號姓名位置/崗位1資料室主管項

3、目資料室2項目組成員34Note: The copy numbers referenced above should be written into the Copy Number space on the cover of each distributed copy. If the document is not controlled, you can delete this table, the Note To Holders, and the Copy Number label from the cover page.目錄文檔控制ii概述4XML組建4XML結(jié)構(gòu)圖4XML常用的分析函數(shù)5

4、XMLParser5XMLDOM5XML解析實例7文件的結(jié)構(gòu)8解析方案8XML解析腳本9更改歷史12Note: To update the table of contents, put the cursor anywhere in the table and press F9. To change the number of levels displayed, select the menu option Insert>Index and Tables, make sure the Table of Contents tab is active, and change the Numbe

5、r of Levels to a new value.6675d1302042a245f49d9a633c4361ae.pdf 此文檔僅做學(xué)習(xí)參考之用 第12 頁共 12頁 概述使用XML文件傳輸數(shù)據(jù),現(xiàn)在已經(jīng)被越來越多的項目所采納。其做法通常是用額外開發(fā)的java 程序來解析XML數(shù)據(jù)。其實Oracle已經(jīng)為XML配備了一套功能健全的工具集,該工具集允許PL/SQL和Java開發(fā)人員在Oracle數(shù)據(jù)庫內(nèi)部進(jìn)行工作。本文簡要地概述了XML特性和適用于Oracle數(shù)據(jù)庫的實用程序,描述如何設(shè)置并使用面向XML的Oracle PL/SQL分析程序,然后介紹了一個實例程序,該程序分析PL/SQL內(nèi)

6、的XML信息。XML組建在PL/SQL中利用XML ,Oracle提供了幾個組件,讓開發(fā)人員能輕松地利用XML技術(shù)。這些組件包括: 1. XML 分析程序。即用來分析、構(gòu)造和驗證XML文檔。. 2. XPath 引擎。 它是使用Xpath(XML標(biāo)準(zhǔn)的另一個元素)說明語法在內(nèi)存中搜索XML文檔的實用程序。 SLT 處理器。 它在Oracle數(shù)據(jù)庫中支持XSLT,允許您把XML文檔轉(zhuǎn)換成其他格式。 3. XML SQL 實用程序??梢允褂肧QL產(chǎn)生XML文檔,使您可以在Oracle數(shù)據(jù)庫表格中輕松地插入基于XML的數(shù)據(jù)。 XSQL 頁。一項可以匯集聲明性XML數(shù)據(jù)然后通過XSLT公布這些數(shù)據(jù)的技

7、術(shù)。 對于PL/SQL開發(fā)人員而言,XML分析程序是最重要的組件。通過它,您可以在Oracle數(shù)據(jù)庫中分析、操縱和轉(zhuǎn)換XML文檔。ML分析程序由一套APIs(應(yīng)用程序編程接口)構(gòu)成。XML結(jié)構(gòu)圖XML常用的分析函數(shù)XMLParser包括分析XML文檔所需的數(shù)據(jù)類型和程序。XML Parsing Process想知道Oracle的parser是如何調(diào)用Java來做解析的,請查看Oracle® XML Developer's Kit Programmer's Guide10g Release 2 (10.2)Part Number B14252-01網(wǎng)址: 程序中常用的方

8、法:Nodelist := dbms_xslprocessor.selectnodes(rootnode, xpath) dbms_xslprocessor.valueof(節(jié)點,節(jié)點下的元素,值) 具體的實例,會在下面講解。XMLDOM 包括管理和建立XML文檔對象模型(DOM)元素所需的數(shù)據(jù)類型和程序Comparing DOM (Tree-Based) and SAX (Event-Based) APIsXMLDOM 這個程序包,其實是通過封裝Java 程序來解析XML 的一個PL/SQL的包。具體的作用還是要參考Oracle® Database PL/SQL Packages

9、and Types Reference10g Release 2 (10.2)Part Number B14258-02網(wǎng)址: XML解析實例案列: XML文件 :simanhe_test.xml<?xml version="1.0" encoding="UTF-8"?><Dfile Status="3"><RecCount>200</RecCount><FailCount>1</FailCount> <FailInfo> <FItem RecE

10、rrCode="2901"> <Item> <Name>測試1</Name> <Comment>滘滘生僻字</Comment> </Item> <Item> <Name>測試2</Name> <Comment>看一看</Comment> </Item> </FItem> </FailInfo> <FailInfo> <FItem RecErrCode="2902"&

11、gt; <Item> <Name>測試3</Name> <Comment>瞅一瞅</Comment> </Item> <Item> <Name>測試4</Name> <Comment>試一試</Comment> </Item> <Item> <Name>測試5</Name> <Comment>爽一爽</Comment> </Item> </FItem> </Fai

12、lInfo>文件的結(jié)構(gòu)解析方案在XML DOM的解析過程中, 如果想找某個節(jié)點(Fitem)的屬性(RecErrCode),而該節(jié)點又不是根節(jié)點時,需要從最小的節(jié)點往上找父節(jié)點,一直到節(jié)點Fitem,然后在得到其屬性。如果節(jié)點是根節(jié)點,則可以直接得到根節(jié)點的元素和屬性的值。根據(jù)上圖所示,我們要找根節(jié)點Dfile的元素和屬性的值,直接調(diào)用 。XML解析腳本Oracle通過調(diào)用API xmldom和dbms_xmlparser來做XML文件的解析。.建立一個 Directory ,假如在EBS上實現(xiàn)則需要在EBS DB的服務(wù)器上建立路徑如: Create Or Replace Directo

13、ry FTP_XXX As '/var/tmp/ftp' 直接在APPS下就可以新建要查找當(dāng)前建立的Directory 可以使用 Select * From all_directories 查找當(dāng)前系統(tǒng)中的所有的 Directory . . 代碼如下 DECLARE p_max_size NUMBER := dbms_lob.lobmaxsize; src_offset NUMBER := 1; dst_offset NUMBER := 1; lang_ctx NUMBER := nls_charset_id('UTF8'); default_csid CONS

14、TANT INTEGER := nls_charset_id('ZHS16GBK'); warning NUMBER; l_file_number PLS_INTEGER := 0; l_count NUMBER; l_bfile BFILE; l_clob CLOB; l_commitelement xmldom.domelement; l_parser dbms_xmlparser.parser; l_doc dbms_xmldom.domdocument; l_nl dbms_xmldom.domnodelist; l_n dbms_xmldom.domnode; roo

15、tnode dbms_xmldom.domnode; parent_rootnode dbms_xmldom.domnode; file_length NUMBER; block_size BINARY_INTEGER; l_rootnode_name VARCHAR2(200); l_status VARCHAR2(1000); l_recerrcode VARCHAR2(1000); l_FailCount VARCHAR2(200); l_RecCount VARCHAR2(200); l_name VARCHAR2(1000); l_comments VARCHAR2(2000); l

16、_exists BOOLEAN; FUNCTION convertclobtoxmlelement(p_document IN CLOB) RETURN xmldom.domelement IS x_commitelement xmldom.domelement; l_parser xmlparser.parser; BEGIN l_parser := xmlparser.newparser; xmlparser.parseclob(l_parser, p_document); x_commitelement := xmldom.getdocumentelement(xmlparser.get

17、document(l_parser); RETURN x_commitelement; END convertclobtoxmlelement;BEGIN - 檢查XML是否在路徑FTP_XXX下是否存在 utl_file.fgetattr('FTP_XXX', 'simanhe_test.xml', l_exists, file_length, block_size); IF NOT l_exists THEN dbms_output.put_line('XML文件不存在'); RETURN; END IF; l_bfile := bfilen

18、ame('FTP_XXX', 'simanhe_test.xml'); - 創(chuàng)建一個Clob dbms_lob.createtemporary(l_clob, TRUE); dbms_lob.OPEN(l_bfile, dbms_lob.lob_readonly); - 將XML文件上載并轉(zhuǎn)換為Clob類型 dbms_lob.loadclobfromfile(l_clob, l_bfile, p_max_size, dst_offset, src_offset, default_csid, - UTF8 lang_ctx, - GBK warning); l_f

19、ile_number := dbms_lob.fileexists(l_bfile); IF l_file_number = 0 THEN dbms_output.put_line('XML文件未被轉(zhuǎn)換成功'); RETURN; END IF; dbms_lob.CLOSE(l_bfile); - Create a parser. l_parser := dbms_xmlparser.newparser; BEGIN - Parse the document and create a new DOM document. dbms_xmlparser.parseclob(l_pa

20、rser, l_clob); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('XML文件不完整'); RETURN; END; l_doc := dbms_xmlparser.getdocument(l_parser); - Free resources associated with the CLOB and Parser now they are no longer needed. dbms_lob.freetemporary(l_clob); - 得到根節(jié)點 rootnode := xmldom.makenode(xmld

21、om.getdocumentelement(xmlparser.getdocument(l_parser); l_rootnode_name := xmldom.getnodename(rootnode); dbms_output.put_line('XML文件當(dāng)前的節(jié)點名稱為 ' | l_rootnode_name); - 得到根節(jié)點元素的值 dbms_xslprocessor.valueof(rootnode, 'RecCount/text()', l_RecCount); dbms_xslprocessor.valueof(rootnode, 'F

22、ailCount/text()', l_FailCount); dbms_output.put_line('XML文件當(dāng)前的節(jié)點名稱為 ' | l_rootnode_name | '的要素RecCount,FailCount值為' | l_RecCount|','|l_FailCount); - 得到根節(jié)點Dfile的屬性Status的值 l_status := xmldom.getattribute(xmldom.makeelement(rootnode), 'Status'); dbms_output.put_line

23、('XML文件當(dāng)前的節(jié)點名稱為 ' | l_rootnode_name | '的屬性Status的值為' | l_status); /*取節(jié)點Item下各元素的值,先將Items節(jié)點全部存放在 l_nl中 */ l_nl := dbms_xmldom.getelementsbytagname(l_doc, 'Item'); l_count := dbms_xmldom.getlength(l_nl); FOR cur_emp IN 0 . dbms_xmldom.getlength(l_nl) - 1 LOOP l_n := dbms_xmldo

24、m.item(l_nl, cur_emp); - 得到節(jié)點Item下元素的值 dbms_xslprocessor.valueof(l_n, 'Name/text()', l_name); dbms_xslprocessor.valueof(l_n, 'Comment/text()', l_comments); - 得到節(jié)點Item的父節(jié)點FItem parent_rootnode := dbms_xmldom.getparentnode(l_n); l_rootnode_name := xmldom.getnodename(parent_rootnode); - 得到節(jié)點FItem的屬性RecErrCode的值 l_recerrcode := xmldom.getattribute(xmldom.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論