当表中某字段是clob类型,保存的是xml格式的信息,如何利用sql来解析xml呢?
oracle自带强大的xmlPar(function),具体如下:
1.
- <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>
2.存储过程
- 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;