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數據。