当表中某字段是clob类型,保存的是xml格式的信息,如何利用sql来解析xml呢?
oracle自带强大的xmlPar(function),具体如下:
<root> <Version id="1"> <ConfigResource> <Products class="java.util.ArrayList"/> <Properties class="java.util.ArrayList"> <Property> <Name>name</Name> <Value><![CDATA[控江]]></Value> </Property> <Property> <Name lang='cn'>alias</Name> <Value><![CDATA[控江-黄兴]]></Value> </Property> <Property> <Name>flag</Name> <Value><![CDATA[53]]></Value> </Property> </Properties> </ConfigResource> </Version> </root>
方法如下,可以写个function(或者存储过程等)来完成
create or replace function fun_gj_xml(xml_content in clob, name in varchar2) return varchar2 is v_result varchar2(2000); v_temp varchar2(2000); v_num number; xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER; --XML解析器 doc xmldom.DOMDocument; --DOM文档对象 tempNodes xmldom.DOMNodeList; tempNode xmldom.DOMNode; tempArrMap xmldom.DOMNamedNodeMap; begin v_result := null; v_temp := null; v_num := 0; if xml_content is null then return v_result; end if; xmlPar := xmlparser.newParser; xmlparser.parseClob(xmlPar,xml_content); doc := xmlparser.getDocument(xmlPar); xmlparser.freeParser(xmlPar); tempNodes:=xmldom.getElementsByTagName(doc, 'Name'); -- 获取所有Name标签元素 while v_num < xmldom.getLength(tempNodes) loop tempNode:=xmldom.item(tempNodes,v_num); if(xmldom.getNodeValue(xmldom.getFirstChild(tempNode)) = name) then -- 当前遍历Name节点值是否是传进来的name值 tempArrMap :=xmldom.getAttributes(tempNode); v_temp :=v_temp || xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'lang')) || ','; --获取name=lang的属性值 tempNode := xmldom.getNextSibling(tempNode); --Value 获取下一个兄弟元素,即Value标签 v_temp := v_temp || xmldom.getNodeValue(xmldom.getFirstChild(tempNode)); --获取Value节点值 exit; end if; v_num := v_num+1; end loop; v_result := v_temp; return v_result; end fun_gj_xml;
结果如下:
本文只是简单的示例,只为抛砖引玉,具体请参考资料。