DECLARE
--:定義或確定要解析的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;
BEGIN
--步驟5:獲取xml數據,以下假設從數據表的clob字段中獲取取,如下:
BEGIN
xmlclobdata := '<?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 version="1.0" encoding="GBK" ?>
<parameters>
<RemittanceParameterItem>
<LeagueCompanyId>2001116</LeagueCompanyId>
<CompanyId>1000</CompanyId>
<RemittanceValue>65000.0</RemittanceValue>
<RemittanceToken>9591503</RemittanceToken>
<RemittanceDateTime>2018-09-26T14:51:22.0Z</RemittanceDateTime>
<Remark>640001391210002018</Remark>
</RemittanceParameterItem>
</parameters>';
**%
--步驟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, 'parameters');
lenunit := xmldom.getlength(unitnodes);
dbms_output.put_line(lenunit);
--遍歷所有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);
dbms_output.put_line(lenitem);
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);
END;
END;