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. zoookeeper集群和kafka集群启动快速启动脚本

    kafka.sh port=9092 # 根据端口号去查询对应的PID pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F&quo ...

  2. linux(centos8):使用namespace做资源隔离

    一,namespace是什么? namespace 是 Linux 内核用来隔离内核资源的方式. 它是对全局系统资源的封装隔离, 处于不同 namespace 的进程拥有独立的全局系统资源, 改变一个 ...

  3. python+selenium 爬取中国工业园网

    import math import re import requests from lxml import etree type = "https://www.cnrepark.com/g ...

  4. Geoserver发布shp文件

    Geoserver是著名的开源GIS软件之一.也是项目中常用的地图服务软件.基于geoserver和Openlayers就可以构建一个免费的开源GIS项目. Geoserver除了浏览以外,其他譬如发 ...

  5. python第三章:函数

    在前面章节中,介绍了一些input(),print(),len()等内建函数,还有random,math等标准库相关函数,这些都是可以直接使用的,但是很多时候,我们也是可以编写自己的函数. 看个例子: ...

  6. GDB使用checkpoint复现bug

    今天面试被问到一个问题,如何调试多进程的程序,我回答gdb attach [pid],之后又问如果程序中有些数据读取不对,但这种现象是偶然发生的,这时候要怎么操作,当时就懵了......,通过查找资料 ...

  7. Linux入门到放弃之三《常用命令(帮助命令,文件压缩和解压,关机、重启,加载光盘...)》

    1.获得命令帮助: man命令的用法: 命令:man find ( 获取find命令的帮助文档 ) 2.复制/root/install.log 到/tmp: ( 确认root目录下是否存在instal ...

  8. 18级北航软件学院算法复习--Samshui

    A 比特手链 简单模拟 判断 贪心 叶姐要想哥赠送一串比特手链,这个手链由0和1组成.想哥买了手链B,无意间得知叶姐想要同样长度的手链A.想哥囊中羞涩,只能手工调整手链.他希望最少通过以下操作进行最少 ...

  9. IDEA Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.8.2-plugin爆红错误

    如果确认本地库存在,maven仓库配置正确,将其显式声明出来,问题解决 <!--报找不到该依赖的错误, 本地库又存在,将其显式声明在这里,问题解决--> <plugin> &l ...

  10. 阿里云MNS官方PHP版SDK缺少message tag问题处理

    最近在使用阿里云MNS官方PHP版SDK的过程中,发现发送到topic的消息,不能设置tag(其它语言版本SDK支持tag,如java,python),但在阿里云控制台页面发送是可以设置tag的. 因 ...