`
zhuchengzzcc
  • 浏览: 440395 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle sql操作xml

 
阅读更多

    当表中某字段是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;

 

 

 

  结果如下:

 

 

 

 本文只是简单的示例,只为抛砖引玉,具体请参考资料。

  • 大小: 8.2 KB
分享到:
评论
1 楼 诸葛不忄亮 2015-05-29  
    

相关推荐

Global site tag (gtag.js) - Google Analytics