【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];【安全】保密,你懂的。
相關推薦
【Java】JAXB 處理 複雜XML 與JavaBean 互相轉化過程
先看看xml樣式: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <EPCISQueryDocumentType xmlns:ns2="http://www.unece.org/cefac
【Java】Jsoup處理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】批處理中Copy與Xcopy的區別
###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
【jQuery】jQ處理xml文件和xml字符串
文本 技術 字符串 處理 兼容 child nodevalue url att 1.xml文件 <?xml version="1.0" encoding="utf-8" ?> <root> <book id="1">
【轉載】開發者眼中的Spring與Java 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>
【java】i++與++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
【java】java處理隨機浮點數(小數點後兩位)用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) /** * 重載