一种在ORACLE中解析XML的方法
1、 引言
本文主要阐述一种在ORACLE中解析XML的实现方法。在oracle8i以及后期的版本中,开始提供了xmldom方式来实现对XML格式数据的处理,但在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。
2、 现象描述
当前,XML数据格式越来越多的应用于各种业务信息系统以及数据交换等应用范围,XML数据变得更加常见以及应用更为广泛。在oracle8i以及后期的版本中,开始提供了xmldom方式来实现对XML格式数据的处理,但在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。
3、 处理过程
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>
步骤1:定义或确定要解析的XML规则,如上。
步骤2:创建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数据,以下假设从数据表的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);
4、 原因分析
目前,在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。
5、 经验总结
通过在ORACLE数据库中直接解析XML数据,能够更方便灵活的处理xml数据,包括创建方法function,存储过程procedure,以及作业JOB,尤其是处理已经存储在数据表中的XML数据。