由于只是初始学习SQL中使用DOM 对XML解析解析,很多技术要点尚未掌握。只是按照一些例子来做测试,包括对多字节字符集的问题也没解决。此处只在此做一记录,供以后重新拾起来。
其中主要使用的是xmldom 的几个函数:selectNodes,getNodevalue等。
-
CREATE OR REPLACE PROCEDURE XMLParserTest (a_xmldata CLOB)
-
IS
-
v_parser xmlparser.Parser;
-
v_domdocument xmldom.DOMDocument;
-
v_domnode xmldom.domnode;
-
v_patientnode xmldom.domnode;
-
v_domnodelist xmldom.DOMNodeList;
-
v_domnodepatientlist xmldom.DOMNodeList;
-
v_length NUMBER;
-
v_data VARCHAR2 (2000);
-
i INTEGER;
-
j INTEGER;
-
BEGIN
-
v_parser := xmlparser.newParser;
-
xmlparser.parseClob (v_parser, a_xmldata);
-
v_domdocument := xmlparser.getDocument (v_parser);
-
xmlparser.freeParser (v_parser);
-
-
v_domnode := xmldom.makenode (v_domdocument);
-
v_domnodelist := xslprocessor.selectNodes (v_domnode, \'/outpbill/patients\'); --/patientid
-
-
v_length := xmldom.getLength (v_domnodelist);
-
DBMS_OUTPUT.put_line (\'patientS length: \' || TO_CHAR (v_length));
-
-
FOR i IN 0 .. v_length - 1
-
LOOP
-
v_domnodepatientlist :=
-
xmldom.getChildNodes (
-
xslprocessor.selectSingleNode (xmldom.item (v_domnodelist, i),
-
\'patientid\'));
-
-
FOR j IN 0 .. xmldom.getLength (v_domnodepatientlist) - 1
-
LOOP
-
/* v_patientnode := xmldom.item(v_domnodepatientlist,j );
-
xmldom.writeToBuffer(v_patientnode,v_data);
-
dbms_output.put_line(v_data);*/
-
-
-
DBMS_OUTPUT.put_line (
-
xmldom.getNodevalue (xmldom.item (v_domnodepatientlist, j)));
-
END LOOP;
-
END LOOP;
-
END XMLParserTest;
-
/
-
-
SHOW ERROR
-
SET SERVEROUTPUT ON
-
-
DECLARE
-
a_xmldata CLOB;
-
BEGIN
-
a_xmldata :=
-
\'234NP NIU PAI123fgsJN JINNIU567\';
-
-
XMLParserTest (a_xmldata);
-
END;
-
/