【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;【安全】保密,你懂的。