DECLARE
v_xmlclob CLOB := '<?xml version="1.0" encoding="UTF-8"?>
<header ID="1" ADDRESS="BEIJING">
<header_name>test</header_name>
<line>
<line_num>1</line_num>
<name>TEST1</name>
<sex>男</sex>
<detail>
<age>12</age>
</detail>
<detail>
<age>13</age>
</detail>
</line>
<line>
<line_num>2</line_num>
<name>TEST2</name>
<sex>女</sex>
<detail>
<age>14</age>
</detail>
<detail>
<age>15</age>
</detail>
</line>
</header>
';
v_clob CLOB;
v_xml_str sys.xmltype;
v_resultcode VARCHAR2(200); v_parser dbms_xmlparser.parser;
v_doc dbms_xmldom.domdocument;
v_rootnode dbms_xmldom.domnode;
v_linelist dbms_xmldom.domnodelist;
v_detailnodes dbms_xmldom.domnode;
v_detaillist dbms_xmldom.domnodelist;
v_detailnode dbms_xmldom.domnode;
v_detail_num NUMBER;
v_linenode dbms_xmldom.domnode;
v_count NUMBER;
v_line_num VARCHAR2(100);
v_name VARCHAR2(100);
v_sex VARCHAR2(100);
v_age VARCHAR2(100);
rootname VARCHAR2(100);
v_header_name VARCHAR2(100);
BEGIN
--1.创建CLOB
dbms_lob.createtemporary(v_clob, TRUE);
v_clob := v_xmlclob;
--2.创建解析器,加载v_clob
v_parser := dbms_xmlparser.newparser;
dbms_xmlparser.parseclob(v_parser, v_clob);
dbms_lob.freetemporary(v_clob); --释放clob
--3.得到根节点
v_rootnode := xmldom.makenode(xmldom.getdocumentelement(xmlparser.getdocument(v_parser)));
rootname := xmldom.getnodename(v_rootnode);
dbms_output.put_line(rootname);
--4.获取根节点中的值
dbms_xslprocessor.valueof(v_rootnode,
'header_name/text()',
v_header_name); dbms_output.put_line(v_header_name);
--5.获取根节点中的属性值
v_resultcode := xmldom.getattribute(xmldom.makeelement(v_rootnode),
'ADDRESS');
dbms_output.put_line(v_resultcode);
--6.创建doc
v_doc := dbms_xmlparser.getdocument(v_parser);
dbms_xmlparser.freeparser(v_parser); --释放解析器
v_linelist := dbms_xmldom.getelementsbytagname(v_doc, 'line'); --获取line节点
v_count := dbms_xmldom.getlength(v_linelist);
dbms_output.put_line('v_count:' || v_count);
FOR cur_emp IN 0 .. v_count - 1 LOOP
v_linenode := dbms_xmldom.item(v_linelist, cur_emp); --获取节点
dbms_xslprocessor.valueof(v_linenode, 'line_num/text()', v_line_num); --得到节点下元素的值
dbms_output.put_line('v_line_num' || v_line_num);
v_detaillist := dbms_xslprocessor.selectnodes(v_linenode, 'detail'); --获取该节点下的子节点detail
v_detail_num := dbms_xmldom.getlength(v_detaillist);
dbms_output.put_line('v_detail_num:' || v_detail_num);
FOR cur_emp2 IN 0 .. v_detail_num - 1 LOOP
v_detailnode := dbms_xmldom.item(v_detaillist, cur_emp2);
dbms_xslprocessor.valueof(v_detailnode, 'age/text()', v_age); --行号
dbms_output.put_line('age' || v_age);
END LOOP;
END LOOP;
xmldom.freedocument(v_doc); --释放doc资源
EXCEPTION
WHEN OTHERS THEN
dbms_lob.freetemporary(v_clob);
dbms_xmlparser.freeparser(v_parser);
dbms_xmldom.freedocument(v_doc); END;

备注:PLSQL解析xml精确定位具体节点。

PLSQL-解析XML的更多相关文章

  1. PLSQL解析XML文件

     参考网上资料学习汇总 在PL/SQL中利用XML ,Oracle提供了几个组件,让开发人员能轻松地利用XML技术.这些组件包括: 1.  XML 分析程序.即用来分析.构造和验证XML文档.. ...

  2. PLSQL读取XML的数据

    最近公司做的几个项目,都是通过EBS与外部系统的Web Service进行数据的交互,而调用Web Service的时候,我们所传送的数据,都是按照约定的XML格式来传递,所以EBS接收到数据之后,需 ...

  3. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  4. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  5. Android之Pull解析XML

    一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...

  6. Android之DOM解析XML

    一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息 ...

  7. Android之SAX解析XML

    一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...

  8. Android 使用pull,sax解析xml

    pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory. ...

  9. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  10. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...

随机推荐

  1. docker将镜像推送到阿里云

    1.背景 在实际生产中我们会经常把镜像推送到云端仓库......... 下面看具体操作 第一步:登录阿里云创建仓库 第二步:在docker上登录阿里云仓库 第三步:推送镜像到阿里云 第四步:在公网上查 ...

  2. Vagrant系列(一)----win10搭建Vagrant+VirtualBox环境_

      一.Vagrant是什么?     vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.    通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的 ...

  3. TCP/IP的十个问题

    一.TCP/IP模型 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的 ...

  4. sql 存储过程 输出参数 输入参数

    1.简单的存储过程 create procedure porc_name as select * from 表 go 调用时: exec proc_name 2. 带参数的存储过程 create pr ...

  5. HTML 5标签中<button>的新属性

    <button> 标签HTML5 中的新属性 属性 值 描述 autofocus autofocus 规定当页面加载时按钮应当自动地获得焦点. disabled disabled 规定应该 ...

  6. ES5新增数组的方法

    ES5新增数组的方法 ES5新增数组常见方法(indexOf/forEach/map/filter/some/every) .indexOf( data , start)  检测数组中是否存在指定数据 ...

  7. Markdown--补充版

    markdown语法实例 markdown语法实例 强调 分割线 引用 标题Setext方式 大标题 小标题 标题Atx方式 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 无序列表 有序 ...

  8. Spring Boot与多数据源那点事儿~

    持续原创输出,点击上方蓝字关注我 目录 前言 写这篇文章的目的 什么是多数据源? 何时用到多数据源? 整合单一的数据源 整合Mybatis 多数据源如何整合? 什么是动态数据源? 数据源切换如何保证线 ...

  9. soundPool声音池

    soundPool可以同时播放多个声音,但是最好文件不要超过1M,声音只能播放几秒,适合游戏混合音效 public class MainActivity extends AppCompatActivi ...

  10. LC滤波电路分析,LC滤波电路原理及其时间常数的计算

    LC滤波器具有结构简单.设备投资少.运行可靠性较高.运行费用较低等优点,应用很广泛. LC滤波器又分为单调谐滤波器.高通滤波器.双调谐滤波器及三调谐滤波器等几种. LC滤波主要是电感的电阻小,直流损耗 ...