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>JXDL</value>
            </item>
            <item>
                <name>年新增归档数</name>
                <value>330</value>
            </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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值