java读取Oracle11g clob存的xml文件,然后解析出来插入到另外一个表中
求解答:读取clob存的xml文件,然后解析出来插入到另外一个表中
大致的要求如下:
已有程序可以把xml文件写入到表1中的clob字段中,我需要写一个触发器把写入的xml文件的内容提取出来,然后解析出来后写入到另外一个表中去。
表1的表结构为:
列名 数据类型 长度 允许空
id Varchar2 25 否
commandId Varchar2 20 是
data clob ----- 是
stamp Varchar2 20 是
Temp表结构(监测设备上报的数据自动写入此表)
Data字段的字符串格式如下:
<com.automic.commu.interf.DataPackage> //说明: 此为根节点 <___DOLLAR_2>com.automic.commu.protocols.auto3_0.DataAuto3_0</___DOLLAR_2> <___DOLLAR_1 class="com.automic.commu.protocols.auto3_0.DataAuto3_0-array"> <com.automic.commu.protocols.auto3_0.DataAuto3_0> //说明:此处为一条记录开始 <meterStatus>0</meterStatus> <sensorStatus>0</sensorStatus> <powerStatus>0</powerStatus> <storePowerVoltStatus>0</storePowerVoltStatus> <pumpStatus>1</pumpStatus> <doorStatus>0</doorStatus> <remainWaterStatus>0</remainWaterStatus> <waterLevelStatus>1</waterLevelStatus> <icCardStatus>1</icCardStatus> <accumulateFlux>72186.0</accumulateFlux> <instantFlux>0.0</instantFlux> <remainWater>-72186.0</remainWater> <waterLevel>0.0</waterLevel> <dateTime>071102 16</dateTime> <meterModel>00</meterModel> <hasEvent>0</hasEvent> <eventFirstCount>0</eventFirstCount> <eventSecondCount>0</eventSecondCount> <eventFlag>00000000000000000000000000000000</eventFlag> <AutoReportType>1</AutoReportType> <gprsId>15832897782</gprsId> <meterNo>2310008899</meterNo> <dataType>10000</dataType> <orderSucc>0</orderSucc> </com.automic.commu.protocols.auto3_0.DataAuto3_0> //说明:此处为一条记录结束标志 <com.automic.commu.protocols.auto3_0.DataAuto3_0> //说明:此处为一条记录开始 <meterStatus>0</meterStatus> <sensorStatus>0</sensorStatus> <powerStatus>0</powerStatus> <storePowerVoltStatus>0</storePowerVoltStatus> <pumpStatus>1</pumpStatus> <doorStatus>0</doorStatus> <remainWaterStatus>0</remainWaterStatus> <waterLevelStatus>1</waterLevelStatus> <icCardStatus>1</icCardStatus> <accumulateFlux>72186.0</accumulateFlux> <instantFlux>0.0</instantFlux> <remainWater>-72186.0</remainWater> <waterLevel>0.0</waterLevel> <dateTime>071102 16</dateTime> <meterModel>00</meterModel> <hasEvent>0</hasEvent> <eventFirstCount>0</eventFirstCount> <eventSecondCount>0</eventSecondCount> <eventFlag>00000000000000000000000000000000</eventFlag> <AutoReportType>1</AutoReportType> <gprsId>15832897782</gprsId> <meterNo>2310008899</meterNo> <dataType>10000</dataType> <orderSucc>0</orderSucc> </com.automic.commu.protocols.auto3_0.DataAuto3_0> //说明:此处为一条记录结束标志 <com.automic.commu.protocols.auto3_0.DataAuto3_0> //说明:此处为一条记录开始 <meterStatus>0</meterStatus> <sensorStatus>0</sensorStatus> <powerStatus>0</powerStatus> <storePowerVoltStatus>0</storePowerVoltStatus> <pumpStatus>1</pumpStatus> <doorStatus>0</doorStatus> <remainWaterStatus>0</remainWaterStatus> <waterLevelStatus>1</waterLevelStatus> <icCardStatus>1</icCardStatus> <accumulateFlux>72186.0</accumulateFlux> <instantFlux>0.0</instantFlux> <remainWater>-72186.0</remainWater> <waterLevel>0.0</waterLevel> <dateTime>071102 16</dateTime> <meterModel>00</meterModel> <hasEvent>0</hasEvent> <eventFirstCount>0</eventFirstCount> <eventSecondCount>0</eventSecondCount> <eventFlag>00000000000000000000000000000000</eventFlag> <AutoReportType>1</AutoReportType> <gprsId>15832897782</gprsId> <meterNo>2310008899</meterNo> <dataType>10000</dataType> <orderSucc>0</orderSucc> </com.automic.commu.protocols.auto3_0.DataAuto3_0> //说明:此处为一条记录结束标志 </___DOLLAR_1> </com.automic.commu.interf.DataPackage>
说明:当监测设备向临时表temp中写入数据时,触发器将temp表中刚写入的记录中data字段字符串中包含的各条记录(若干条,条数不确定)解析出来,将其中有用的信息解析出来写入下面目标表结构中,比如<accumulateFlux>72186.0</accumulateFlux>,将72186.0写入目标表结构中accumulateFlux字段下面,目标表中commandId是temp表中的commandId..
2 目标表结构(CollectData)(触发器解析temp表中data字段的字符串后写入此表中)
列名 数据类型 长度 允许空
commandId Varchar2 20 是
GPRSid Varchar2 15 否
sensorStatus Number 1 是
powerStatus Number 1 是
remainWaterStatus Number 1 是
accumulateFlux Number (8,2) 是
instantFlux Number (5,3) 是
remainWater Number (8,2) 是
dateTime Date 是
我想主要的流程为:
1。读取xml文件
2。解析xml到table2中,不知道现成的工作可以直接用,还是需要按照字符来定义,比如自己解析每一条记录的开始位置等。
多谢了!!
我测试了一下 ,看符合你的要求么
第一个表:xmldata
第二个表:xmltest
接下来是存储过程。
create or replace procedure p_parse (ID in varchar2) is --创建xml解析器实例xmlparser.Parser xmlPar xmlparser.Parser :=xmlparser.newParser; --定义DOM文档 xDoc xmldom.DOMDocument; --定义DATA子节点数目变量 lenItme integer; --定义节点列表,存放DATA节点们 itemNodes xmldom.DOMNodeList; --定义节点列表,存放DATA子节点们 childNodes xmldom.DOMNodeList; --定义节点,存放单个DATA节点 itemNode xmldom.DOMNode; --定义属性变量,存放节点属性 itemArrMap xmldom.DOMNamedNodeMap; --定义其他变量,存放子节点的值 name varchar(100); value varchar(100); newid NUMBER(10); --定义clob变量,存放xml字符串para_name xmlStr clob; begin for cur in (select t.xml_data para_name ,t.id from xmldata t where t.id=ID ) --从xmldata表中查询数据,id不是唯一标识,一个id可查出多条数据(XML中多条数据),故用loop循环 loop --获取para_name中的xml字符串 xmlStr:=cur.para_name; xmlPar :=xmlparser.newParser; --解析xmlStr中xml字符串,并存放到xmlPar中 xmlparser.parseClob(xmlPar, xmlStr); --将xmlPar中的数据转存到dom文档中 xDoc:=xmlparser.getDocument(xmlPar); xmlparser.freeParser(xmlPar); --释放解析器实例 --获取所有DATA节点 itemNodes:=xmldom.getElementsByTagName(xDoc,'DATA'); --获取DATA节点的个数 lenItme :=xmldom.getLength(itemNodes); --遍历所有的DATA节点 for i in 0..lenItme-1 loop begin --获取节点列表中的第i个DATA节点 itemNode:=xmldom.item(itemNodes,i); --获取第i个DATA节点的所有子节点 childNodes:=xmldom.getChildNodes(itemNode); --获取所有子节点的值 newid:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,0))); name:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,1))); value:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,2))); --将子节点的值newid,name,value存放到xmltest insert into xmltest values(newid,name,value); commit; end; end loop; end loop; --是否dom文档 xmldom.freeDocument(xDoc); --异常和错误处理 EXCEPTION WHEN OTHERS THEN DBMS_output.PUT_LINE(SQLERRM); end p_parse;
最后是测试:
执行存储过程, 需要输入一个ID 就是你要查询的那个xml串的那个ID 我的是1。
执行后xmltest表为:
再看看XML字符串。。
<root> <DATA> <ID>1</ID> <NAME>ivan</NAME> <VALUE>123</VALUE> </DATA> <DATA> <ID>2</ID> <NAME>TEST</NAME> <VALUE>777</VALUE> </DATA> <DATA> <ID>3</ID> <NAME>newc</NAME> <VALUE>666</VALUE> </DATA> </root>
根据楼主要求, 在xmldata添加触发器 after insert 的时候去调用存储过程 把ID传过去就好了。
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?