当表中某字段是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;
结果如下:
本文只是简单的示例,只为抛砖引玉,具体请参考资料。