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. 2.通过QOpenGLWidget绘制三角形

    参考:1.opengl绘制三角形 1.QOpenGLWidget的早先版本 QGLWidget是遗留Qt OpenGL模块的一部分,和其他QGL类一样,应该在新的应用程序中避免使用.相反,从Qt 5. ...

  2. Python之数据类型总结

    1.字符串 2.数字 3.列表 4.元组 5.字典 可变 or 不可变 1:可变:列表.字典 2:不可变:字符串,数字,元组 访问顺序 1.直接访问:数字 2.顺序访问:字符串,列表,元组 3.映射访 ...

  3. Linux命令之date +%F

    date命令显示当前日期 date +%F显示当前日期 [10:02:52 root@C8[ 2020-06-16DIR]#touch `hostname`_`date +%F`.log [10:03 ...

  4. springboot入门系列(二):SpringBoot整合Swagger

    上一篇<简单搭建SpringBoot项目>讲了简单的搭建SpringBoot 项目,而 SpringBoot 和 Swagger-ui 搭配在持续交付的前后端开发中意义重大,Swagger ...

  5. Vue踩坑日记-This dependency was not found:element-ui.js

    该问题为在Vue启动项目时候报错找不到element-ui模块 解决办法:打开CMD 控制台 CD到项目根目录 我的目录(C:\Users\Administrator\Desktop\cms-heli ...

  6. Jquery中$("").事件()和$("").on("事件","指定的元素",function(){});的区别(jQuery动态绑定事件)

    这个是在学习时不懂的问题,记录下来方便查看 转至https://www.cnblogs.com/mr-wuxiansheng/p/7136864.html //绑定 下一页 的点击事件 $(" ...

  7. maven中pom.xml文件配置

    <properties>                <spring.version>4.3.18.RELEASE</spring.version>        ...

  8. 解谜:为何用了9-Patch背景图后自带Padding属性?

    本次分享的主题源于笔者在实际开发中遇到的问题. 具体现象为:当普通的9-Patch图用作TextView的backGround属性后,整个TextView便有了一定的Padding值.但笔者并没有给定 ...

  9. 老板,来几道web玩玩

    好久没做web了,没想到还能自己做出来555 [MRCTF2020]Ez_bypass 签到题8 给了源码,一个md5强类型比较,然后post传参,弱类型判断,直接1234567a绕过了 I put ...

  10. windows7 安装配置NodeJS、NPM

    转载自https://blog.csdn.net/dengxw00/article/details/82974808 windows7 安装配置NodeJS.NPM一.安装 NodeJS1.登陆官网( ...