Oracle使用PLSQL来处理XML

1、概述

在oracle8i以及后期的版本中,开始提供了xmldom方式来实现对XML格式数据的处理,但在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。

2、处理过程

XML数据可以为字符串(适合处理较小的xml数据)、物理文件或CLOB字段(处理较大的xml数据字段);以如下的XML数据为例来描述该解析处理过程。

XML数据格式示例如下:

<xml version="1.0" encoding="GBK">
    <items>
        <unit>
            <item>
                <name>单位名称name>
                <value>JXDLvalue>
            item>
            <item>
                <name>年新增归档数name>
                <value>330value>
            item>
        unit>
    items>
xml>

(1)定义解析的XML规则

定义或确定要解析的XML规则,如上。

(2)创建XML解析器

创建XML解析器实例XMLPARSER.parser

xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;

(3)定义DOM文档对象

doc xmldom.DOMDocument;

(4)定义其他对象

定义解析XML所需要的其他对象,如下:

lenUnit integer;
lenItem integer;
unitNodes xmldom.DOMNodeList;
itemNodes xmldom.DOMNodeList;
chilNodes xmldom.DOMNodeList;
tempNode_unit xmldom.DOMNode;
tempNode xmldom.DOMNode;
tempArrMap xmldom.DOMNamedNodeMap;
--================================
--以下变量用于获取XML节点的值
name varchar2(50);
value varchar2(20);
tmp integer;
--================================
xmlClobData clob;

(5)获取xml数据

获取xml数据,以下假设从数据表的clob字段中获取取,如下:

 select datastring into xmlClobData from p_xml_datainfo t where …… ;

(6)解析xml数据

xmlPar := xmlparser.newParser; 
--xmlparser.parseBuffer(xmlPar,xmlString);--
xmlparser.parseClob(xmlPar,xmlClobData);
doc := xmlparser.getDocument( xmlPar );
-- 释放解析器实例
xmlparser.freeParser(xmlPar);
-- 获取所有unit元素
unitNodes := xmldom.getElementsByTagName( doc, 'unit' );
lenUnit := xmldom.getLength( unitNodes );
--遍历所有unit元素
FOR i in 0..lenUnit-1
LOOP
    --获取第i个unit
    tempNode_unit := xmldom.item( unitNodes, i );  
    itemNodes:=xmldom.getChildNodes(tempNode_unit); 
    lenItem := xmldom.getLength( itemNodes );
    FOR j in 0..lenItem-1
    LOOP
        tempNode := xmldom.item( itemNodes, j );     
        --获取子元素的值
        chilNodes := xmldom.getChildNodes(tempNode);
        tmp := xmldom.GETLENGTH( chilNodes );
        name := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));
        value := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));
        DBMS_output.PUT_LINE(i||j,name,value);
    end loop;
END LOOP;

(7)释放文档对象

xmldom.freeDocument(doc);

(8)异常与错误处理

EXCEPTION
	WHEN OTHERS THEN
		DBMS_output.PUT_LINE(SQLERRM);

你可能感兴趣的:(oracle,xml,数据库)