1. 程式人生 > >【Java】JAXB 處理 複雜XML 與JavaBean 互相轉化過程

【Java】JAXB 處理 複雜XML 與JavaBean 互相轉化過程

先看看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")
@XmlElementRef
public 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>
文章僅提供一種思路的處理方案,已經在專案上面使用。博友還可以想想其他方法。
【總監】十二春秋之,[email protected]【Master】zelo,[email protected];【運營】運維艄公[email protected]【產品設計】流浪貓,[email protected];【體驗設計】兜兜,[email protected]【iOS】淘碼小工,[email protected];iMcG33K,[email protected]【Android】人猿居士,[email protected]思路的頓悟,[email protected]【java】首席工程師MR_W,[email protected];【測試】土鏡問道,[email protected]【資料】fox009521,[email protected];【安全】保密,你懂的。

相關推薦

JavaJAXB 處理 複雜XML JavaBean 互相轉化過程

先看看xml樣式: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <EPCISQueryDocumentType xmlns:ns2="http://www.unece.org/cefac

JavaJsoup處理URLs

問題 你有一個包含相對URLs路徑的HTML文件,需要將這些相對路徑轉換成絕對路徑的URLs。 方法 在你解析文件時確保有指定base URI,然後 使用 abs: 屬性字首來取得包含base URI的絕對路徑。程式碼如下:  Doc

java計算圖形的周長面積

package test1; import java.util.Scanner; class circle{ double r,a,b,h; public double zfx(double a) {

java面向物件程式設計——類物件的繼承和多型

一、程式碼塊 程式碼塊定義:使用 {} 定義的一段程式碼。 根據程式碼塊定義的位置以及關鍵字,又可分為以下四種: 普通程式碼塊(定義在方法中,除錯) 構造塊(定義在類中的(不加修飾符)) 靜態塊 同步程式碼塊 構造塊 構造塊在每次產生一個新的物件就呼叫一次構

java面向物件程式設計——類物件的封裝

Java比C更方便的地方在於Java是面向物件的。面向物件的特徵: 1、封裝 ; 2、繼承 ; 3、多型; 以下對面向物件的封裝特徵進行簡述: 一、類與物件的定義與使用 類是指共性的概念,物件是一個具體的、可以使用的事物。 首先產生類,而後才可以產生物件。 類的組成: 1.

batch處理中CopyXcopy的區別

###Date: 2017/6/20###Author: Soaringlee1):copy不能在有子目錄存在的檔案中拷貝檔案的同時重新命名此檔名(注:這裡C:為根目錄,bat為子目錄),而xcopy能,不過會出現提示,當然你可以加引數而不使它提示。C:\>copy c

Java異常處理練習題所遇到的錯誤

異常處理練習題所遇到的錯誤 問題:try catch 在一個包含輸入的迴圈裡,catch語句塊無限迴圈執行。 一切源於這道題 數字格式異常 編寫一個程式,提示使用者讀取兩個整數,然後顯示他們的和。程式應該在輸入不正確時提示使用者再次輸入

java執行緒的建立使用

一、執行緒的簡介執行緒是程式執行流的最小單元,一個程序可以包括多個執行緒,各個執行緒之間可以並行,也可以互相影響。每一個程序都至少有一個執行緒。二、建立並使用執行緒在java中,執行緒(Thread)是繼承自Object,在java.lang.Thread中被宣告。想要使用程

Java淺析虛擬機器結構機制

 淺析Java虛擬機器結構與機制        本文旨在給所有希望瞭解JVM(Java Virtual Machine)的同學一個概念性的入門,主要介紹了JVM的組成部分以及它們內部工作的機制和原理。當然本文只是一個簡單的入門,不會涉及過多繁雜的引數和配置,感興趣的同學

Java之static靜態方法非static靜態方法區別

span get nbsp ati pub public ring spa 靜態方法 1、A.class:沒有static public class A { public String getText(){ } B.class調用A的方法

專欄 - 影象處理搜尋(java)

影象處理與搜尋(java) 本專欄是我大三做一個關於影象搜尋技術的專案時積累的技術。從最基礎的數字影象基礎開始講起,每一章都結合Java程式碼具體實現。原始碼請參見:https://github.com/luoweifu/Imag

網路爬蟲java微博爬蟲(四):資料處理——jsoup工具解析html、dom4j讀寫xml

        之前提到過,對於簡單的網頁結構解析,可以直接通過觀察法、手工寫正則解析,可以做出來,比如網易微博。但是對於結構稍微複雜點的,比如新浪微博,如果還用正則,用眼睛一個個去找,未免太麻煩了。         本文介紹兩個工具包:解析html, xml的jsoup,

java對數據庫操作的那些事(包含數據庫中的預處理

exception main exc 獲取 bat dba else .class 可維護 一、連接問題 前面剛介紹了怎麽連接數據庫,也寫了對應的模板。可是它的可維護性很差。那麽怎麽解決問題呢? 首先寫一個配置文件jdbc.properties <s

jQueryjQ處理xml文件和xml字符串

文本 技術 字符串 處理 兼容 child nodevalue url att 1.xml文件 <?xml version="1.0" encoding="utf-8" ?> <root> <book id="1">

轉載開發者眼中的SpringJava EE

客戶端 實現 意義 代理 produces 有著 hiberna arm 激情   轉載自:http://www.infoq.com/cn/news/2015/07/spring-javaee 在Java社區中,Spring與Java EE之爭是個永恒的話題。在這場爭論中,

Java解析xml

tle void code public cnblogs () clas 河南 asn xml: <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE>  

javai++++i、i--運算

log 原理 ring 自加 clas rgs stat static system 1 package test; 2 3 //i++與--i運算 4 public class test { 5 6 public static void main

javajava處理隨機浮點數(小數點後兩位)用RMB的大寫數值規則輸出

pen junit toc get code package 部分 amp print 晚上上床前,拿到這個有意思的問題,就想玩弄一番: ====================================================================

Java基礎:常見修飾符(權限修飾符以及abstract、static、final等)變量的描述

線程 cte string 數據 執行 style 權限 實例 類名 1. 修飾符 public、protected、private、default abstract、static、final、 abstract:抽象類、抽象方法 static:靜態變量、

Java重載(Overload)重寫(Override)

{} 方法 ide jump exce 上一條 內部 https pre 方法的語法 修飾符 返回值類型 方法名(參數類型 參數名){ ... 方法體 ... return 返回值; } 重載(overload) /** * 重載