在ORACLE中使用DOM方式解析XML
XML格式:
<Message id="101">
<From>Montgomery Burns</From>
<Text>Release the Hounds!</Text>
</Message>
解析程式碼
CREATE OR REPLACE FUNCTION idAttributeOfDocElement(xmldoc VARCHAR2 )
RETURN VARCHAR2 IS
theXmlDoc xmldom.DOMDocument;
theDocElt xmldom.DOMElement;
retval VARCHAR2(400);
XMLParseError EXCEPTION;
PRAGMA EXCEPTION_INIT( XMLParseError, -20100 );
-- Local parse function keeps code cleaner. Return NULL if parse fails
FUNCTION parse(xml VARCHAR2) RETURN xmldom.DOMDocument IS
retDoc xmldom.DOMDocument;
parser xmlparser.Parser;
BEGIN
parser := xmlparser.newParser;
xmlparser.parseBuffer(parser,xml);
retDoc := xmlparser.getDocument(parser);
xmlparser.freeParser(parser);
RETURN retdoc;
EXCEPTION
-- If the parse fails, we'll jump here.
WHEN XMLParseError THEN
xmlparser.freeParser(parser);
RETURN retdoc;
END;
BEGIN
-- Parse the xml document passed in the VARCHAR2 argument
theXmlDoc := parse(xmldoc);
-- If the XML document returned is not NULL...
IF NOT xmldom.IsNull(theXmlDoc) THEN
-- Get the outermost enclosing element (aka "Document Element")
theDocElt := xmldom.getDocumentElement(theXmlDoc);
-- Get the value of the document element's "id" attribute
retval := xmldom.getAttribute(theDocElt,'id');
-- Free the memory used by the parsed XML document
xmldom.freeDocument(theXmlDoc);
RETURN retval;
ELSE
RETURN NULL;
END IF;
END;
上面這個是傳入一個XML格式的字串,然後進行解析,但是有一個侷限,就是varchar2的長度為4000
如果再長了將會報錯
所以可以傳入一個CLOB,CLOB的長度為4G
CREATE OR REPLACE FUNCTION idAttributeOfDocElements(xmldoc in CLOB)
return varchar2
is
theXmlDoc xmldom.DOMDocument;
n1 xmldom.DOMNodeList;
len1 number(10);
len2 number(10);
v1 xmldom.DOMNode;
n2 xmldom.DOMNodeList;
attn xmldom.DOMNode;
vretuval varchar2(1000):='';
XMLParseError EXCEPTION;
PRAGMA EXCEPTION_INIT( XMLParseError, -20100 );
-- Local parse function keeps code cleaner. Return NULL if parse fails
FUNCTION parse(xml CLOB) RETURN xmldom.DOMDocument IS
retDoc xmldom.DOMDocument;
parser xmlparser.Parser;
BEGIN
parser := xmlparser.newParser;
xmlparser.ParseCLOB(parser,xml);
retDoc := xmlparser.getDocument(parser);
xmlparser.freeParser(parser);
RETURN retdoc;
EXCEPTION
--If the parse fails, we''ll jump here.
WHEN XMLParseError THEN
xmlparser.freeParser(parser);
dbms_output.put_line('errors');
RETURN retdoc;
END;
BEGIN
-- Parse the xml document passed in the CLOB argument
theXmlDoc := parse(xmldoc);
-- If the XML document returned is not NULL...
IF NOT xmldom.IsNull(theXmlDoc) THEN
-- Get the outermost enclosing element (aka "Document Element")
--theDocElt := xmldom.getDocumentElement(theXmlDoc);
-- Get the value of the document element's "id" attribute
n1:= xmldom.getElementsByTagName(theXmlDoc, 'HB');
len1 := xmldom.getLength(n1);
dbms_output.put_line(len1);
--獲得<HB></HB>節點的數量
for i in 0 .. len1 - 1 loop
--獲得節點
v1 := xmldom.item(n1, i);
--獲得該節點下所有的子節點
n2 := xmldom.getChildNodes(v1);
--獲得子節點的數量
len2 := xmldom.getLength(n2);
for j in 0..len2-1 loop
--dbms_output.put_line(len2);
attn:=xmldom.item(n2,j);
dbms_output.put_line(xmldom.getNodeValue(xmldom.getFirstChild(attn)));
end loop;
end loop;
-- Free the memory used by the parsed XML document
xmldom.freeDocument(theXmlDoc);
RETURN vretuval;
ELSE
RETURN vretuval;
END IF;
END;
/
測試程式碼:
select idAttributeOfDocElements
(
'<A>
<HB><HBH>CA1306</HBH><C>SZXPEK</C><TIME>2007-07-31</TIME><USER>4001</USER><STYPE>1</STYPE><CWB>FAC5YAFAC5YAFAC5YA</CWB><PP>我是誰哦</PP></HB>
</A>'
) from dual;