【Java】JAXB 处理 复杂XML 与JavaBean 互相转化过程
来源:互联网 发布:3d智能试衣镜 知乎 编辑:程序博客网 时间:2024/05/20 05:45
先看看xml样式:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><EPCISQueryDocumentType xmlns:ns2="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:ns4="urn:epcglobal:epcis:xsd:1" xmlns:ns3="urn:epcglobal:epcis-query:xsd:1"> <EPCISBody> <ns3:QueryResults> <queryName>SimpleEventQuery</queryName> <resultsBody> <EventList> <A> <eventTime>2017-01-01T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。 </A> <A> <eventTime>2017-01-01T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。 </A> <B> <eventTime>2017-01-01T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>59676649471ced070e2a66d5</eventID> </baseExtension> 。。。 </B> <B> <eventTime>2017-01-01T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>59676649471ced070e2a66d5</eventID> </baseExtension> 。。。 </B> <C> <eventTime>2017-01-02T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>5967664d471ced070e2a66d6</eventID> </baseExtension> <epcList> <epc>urn:epc:id:sscc:51100000717849570K.JR3638</epc> </epcList> 。。。 </C> <C> <eventTime>2017-01-02T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。。 </C> </EventList> </resultsBody> </ns3:QueryResults> </EPCISBody></EPCISQueryDocumentType>
在这个xml中:C 有多个并且是多种类型,A有多个,B也有多个, 如何转化为javaBean存入数据库一张表里面呢? 我想了一个方法,设计一个BaseEvent 让 A B C 同时继承它,在设计一个大的 defineEvent 继承BaseEvent,defineEvent包含A B C 自己的特有属性,同时增加一个属性type ,用于标记这条记录是从那个类转化过来的。 sax解析到eventList后,将A B C 转化为 defineEvent 同时将a b c 的名字作为type的内容 set进去 ,然后在将 defineEvent 存入数据库即可。
那如何将存入数据库的defineEvent 转化为 上面XML样式呢?思路是这样的,从数据库拿到defineEvent后,根据type内容 在转换成 相应的A B C,这时候就会拿到一个列表 这个列表是这样的:List<BaseEvent> ObjectEvent ,其中 A B C 之前都是继承BaseEvent的,所以这样写没有问题,在转化xml的过程中发现原本应该标签 是 A B C ,结果都成了ObjectEvent,如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><EPCISQueryDocumentType xmlns:ns2="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:ns4="urn:epcglobal:epcis:xsd:1" xmlns:ns3="urn:epcglobal:epcis-query:xsd:1"> <EPCISBody> <ns3:QueryResults> <queryName>SimpleEventQuery</queryName> <resultsBody> <EventList> <ObjectEvent> <eventTime>2017-01-01T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。 </ObjectEvent> <ObjectEvent> <eventTime>2017-01-01T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>59676649471ced070e2a66d5</eventID> </baseExtension> 。。。 </ObjectEvent> <ObjectEvent> <eventTime>2017-01-02T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>5967664d471ced070e2a66d6</eventID> </baseExtension> <epcList> <epc>urn:epc:id:sscc:51100000717849570K.JR3638</epc> </epcList> 。。。 </ObjectEvent> <ObjectEvent> <eventTime>2017-01-02T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。。 </ObjectEvent> </EventList> </resultsBody> </ns3:QueryResults> </EPCISBody></EPCISQueryDocumentType>
找了好长时间 ,发现问题出在 BaseEvent上面, jaxb处理 继承JavaBean时候 需要XmlSeeAlso标记一下:
@XmlAccessorType(XmlAccessType.FIELD)@XmlSeeAlso({A.class,B.class,C.class})public class BaseEvent{ 。。。}
这样是不是就解决问题了?见xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><EPCISQueryDocumentType xmlns:ns2="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:ns4="urn:epcglobal:epcis:xsd:1" xmlns:ns3="urn:epcglobal:epcis-query:xsd:1"> <EPCISBody> <ns3:QueryResults> <queryName>SimpleEventQuery</queryName> <resultsBody> <EventList> <ObjectEvent: xsi:type="A"> <eventTime>2017-01-01T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。 </ObjectEvent> <ObjectEvent: xsi:type="A"> <eventTime>2017-01-01T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。 </ObjectEvent> <ObjectEvent: xsi:type="B"> <eventTime>2017-01-01T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>59676649471ced070e2a66d5</eventID> </baseExtension> 。。。 </ObjectEvent> <ObjectEvent: xsi:type="B"> <eventTime>2017-01-01T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>59676649471ced070e2a66d5</eventID> </baseExtension> 。。。 </ObjectEvent> <ObjectEvent: xsi:type="C"> <eventTime>2017-01-02T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>5967664d471ced070e2a66d6</eventID> </baseExtension> <epcList> <epc>urn:epc:id:sscc:51100000717849570K.JR3638</epc> </epcList> 。。。 </ObjectEvent> <ObjectEvent: xsi:type="C"> <eventTime>2017-01-02T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。。 </ObjectEvent> </EventList> </resultsBody> </ns3:QueryResults> </EPCISBody></EPCISQueryDocumentType>
还是没有解决,不仅如此,ObjectEvent 位置还增加一个type <ObjectEvent: xsi:type="C">
心中顿时一群小羊驼走过,如何处理,找了好长时间,看resultsBody位置,原来的
@XmlElementWrapper(name = "EventList")public List<BaseEvent> objectEvent;
增加了@XmlElementRef
@XmlElementWrapper(name = "EventList")@XmlElementRefpublic List<BaseEvent> objectEvent;
问题得到解决。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><EPCISQueryDocumentType xmlns:ns2="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:ns4="urn:epcglobal:epcis:xsd:1" xmlns:ns3="urn:epcglobal:epcis-query:xsd:1"> <EPCISBody> <ns3:QueryResults> <queryName>SimpleEventQuery</queryName> <resultsBody> <EventList> <A> <eventTime>2017-01-01T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。 </A> <A> <eventTime>2017-01-01T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。 </A> <B> <eventTime>2017-01-01T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>59676649471ced070e2a66d5</eventID> </baseExtension> 。。。 </B> <B> <eventTime>2017-01-01T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:37.759Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>59676649471ced070e2a66d5</eventID> </baseExtension> 。。。 </B> <C> <eventTime>2017-01-02T08:00:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> <baseExtension> <eventID>5967664d471ced070e2a66d6</eventID> </baseExtension> <epcList> <epc>urn:epc:id:sscc:51100000717849570K.JR3638</epc> </epcList> 。。。 </C> <C> <eventTime>2017-01-02T08:01:00.000Z</eventTime> <recordTime>2017-07-13T12:23:41.478Z</recordTime> <eventTimeZoneOffset>-08:00</eventTimeZoneOffset> 。。。。 </C> </EventList> </resultsBody> </ns3:QueryResults> </EPCISBody></EPCISQueryDocumentType>
文章仅提供一种思路的处理方案,已经在项目上面使用。博友还可以想想其他方法。
知行办公,专业移动办公平台 https://zx.naton.cn/原创团队【总监】十二春秋之,3483099@qq.com;【Master】zelo,616701261@qq.com;【运营】运维艄公,897221533@qq.com;【产品设计】流浪猫,364994559@qq.com;【体验设计】兜兜,2435632247@qq.com;【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;【java】首席工程师MR_W,feixue300@qq.com;【测试】土镜问道,847071279@qq.com;【数据】fox009521,42151960@qq.com;【安全】保密,你懂的。
- 【Java】JAXB 处理 复杂XML 与JavaBean 互相转化过程
- JAXB实现JavaBean与XML互相转换
- Jaxb技术进行xml和javabean对象之间互相转化
- xml与javaBean的互相转化
- Java Jaxb JavaBean与XML互转
- java 通过JAXB 实现对象和xml互相转化
- JAXB实现JavaBean和xml互相转换
- JAXB生成xml及转化javaBean
- JAXB:Java Object与XML的互相转换
- JAXB 实现java对象与xml之间互相转换(一)
- JAXB 实现java对象与xml之间互相转换(二)
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- 加解密 理论基础 一
- OkHttp网络框架的使用
- [Lintcode] #2 尾部的零
- 【luogu 2863】[USACO06JAN]牛的舞会The Cow Prom题目描述
- php return 和 return false区别
- 【Java】JAXB 处理 复杂XML 与JavaBean 互相转化过程
- POJ-2182 Lost Cows (二分 + 树状数组 或者平衡树)
- 解读GAN及其 2016 年度进展
- android studio在ADMcpu的电脑上无法开启虚拟机的问题
- windows下安装python版本的opencv
- js单张图片平移切换
- C++中break语句和continue语句讲解及使用实例
- Oracle存储过程
- Collection,List,Set