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);