1. 程式人生 > >JAXBContext轉換包含集合屬性的xml與java集合物件Demo

JAXBContext轉換包含集合屬性的xml與java集合物件Demo

核心類:

package com.jaxb;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class JaxbReadXml {

    @SuppressWarnings("unchecked")
    public static <T> T readString(Class<T> clazz, String context) throws JAXBException {
        try {
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Unmarshaller u = jc.createUnmarshaller();
            return (T) u.unmarshal(new File(context));
        } catch (JAXBException e) {
            // logger.trace(e);
            throw e;
        }
    }

    @SuppressWarnings("unchecked")
    public static <T> T readConfig(Class<T> clazz, String config, Object... arguments) throws IOException,
            JAXBException {
        InputStream is = null;
        try {
            if (arguments.length > 0) {
                config = MessageFormat.format(config, arguments);
            }
            // logger.trace("read configFileName=" + config);
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Unmarshaller u = jc.createUnmarshaller();
            is = new FileInputStream(config);
            return (T) u.unmarshal(is);
        } catch (IOException e) {
            // logger.trace(config, e);
            throw e;
        } catch (JAXBException e) {
            // logger.trace(config, e);
            throw e;
        } finally {
            if (is != null) {
                is.close();
            }
        }
    }

    @SuppressWarnings("unchecked")
    public static <T> T readConfigFromStream(Class<T> clazz, InputStream dataStream) throws JAXBException {
        try {
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Unmarshaller u = jc.createUnmarshaller();
            return (T) u.unmarshal(dataStream);
        } catch (JAXBException e) {
            // logger.trace(e);
            throw e;
        }
    }

    public static void main(String[] args) throws JAXBException {
        TestOrgs testOrgs = JaxbReadXml.readString(TestOrgs.class, "test/test.xml");
        System.out.println(testOrgs.getSize());
        System.out.println(testOrgs.getBatchNumber());
        System.out.println(testOrgs.getErrmsg());
        for (TestOrg o : testOrgs) {
            System.out.println(o.getOrgName());
        }
    }
}

成員類:
package com.jaxb;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@SuppressWarnings("serial")
@XmlRootElement(name = "orgs")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestOrgs extends ArrayList<TestOrg> { // 泛化, 聚合

    @XmlAttribute(name = "size")
    private int size;
    @XmlAttribute(name = "batch_number")
    private Long batchNumber;
    @XmlAttribute(name = "errmsg")
    private String errmsg;

    @XmlElement(name = "org")
    public List<TestOrg> getOrgs() {
        return this;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public Long getBatchNumber() {
        return batchNumber;
    }

    public void setBatchNumber(Long batchNumber) {
        this.batchNumber = batchNumber;
    }

    public String getErrmsg() {
        return errmsg;
    }

    public void setErrmsg(String errmsg) {
        this.errmsg = errmsg;
    }

}

成員類2:
package com.jaxb;

import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

/**
 * <pre>
 *     If you annotate your Artifact class with the annotation:
 *  @XmlAccessorType(XmlAccessType.FIELD)
 *  then you do not need to annotate the fields with @XmlElement and the
 *  setter/getter methods will be ignored.
 * </pre>
 * 
 * @author User
 */
@XmlAccessorType(XmlAccessType.FIELD)
// 用了這個之後就會自動忽略setter/getter方法。不用這個就需要去掉註解,需要保證屬性名和xml裡的表簽名一致
public class TestOrg {
    @XmlElement(name = "org_id")
    private Long orgId;
    @XmlElement(name = "parent_id")
    private Long parentId;
    @XmlElement(name = "org_name")
    private String orgName;
    @XmlElement(name = "org_code")
    private String orgCode;
    @XmlElement(name = "org_type")
    private String orgType;
    @XmlElement(name = "start_d")
    private Date startDate;
    @XmlElement(name = "end_d")
    private Date endDate;
    @XmlElement(name = "attribute1")
    private String attribute;
    @XmlElement(name = "insert_t")
    private Date insertTime;

    public Long getOrgId() {
        return orgId;
    }

    public void setOrgId(Long orgId) {
        this.orgId = orgId;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public String getOrgName() {
        return orgName;
    }

    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }

    public String getOrgCode() {
        return orgCode;
    }

    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }

    public String getOrgType() {
        return orgType;
    }

    public void setOrgType(String orgType) {
        this.orgType = orgType;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public String getAttribute() {
        return attribute;
    }

    public void setAttribute(String attribute) {
        this.attribute = attribute;
    }

    public Date getInsertTime() {
        return insertTime;
    }

    public void setInsertTime(Date insertTime) {
        this.insertTime = insertTime;
    }

}
xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<orgs size="7095" batch_number="20130704110039" errmsg="">
    <org>
        <org_id>16817</org_id>
        <parent_id>9233</parent_id>
        <org_name>512AAS.蘇州滄浪區</org_name>
        <org_code>512AAS</org_code>
        <org_type>門店部門</org_type>
        <start_d>2011-12-28</start_d>
        <end_d></end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-4 10:32:09</insert_t>
    </org>
    <org>
        <org_id>16817</org_id>
        <parent_id>9233</parent_id>
        <org_name>512AAS.蘇州滄浪區</org_name>
        <org_code>512AAS</org_code>
        <org_type>門店部門</org_type>
        <start_d>2011-12-28</start_d>
        <end_d></end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-4 10:32:09</insert_t>
    </org>
    <org>
        <org_id>16817</org_id>
        <parent_id>9233</parent_id>
        <org_name>512AAS.蘇州滄浪區</org_name>
        <org_code>512AAS</org_code>
        <org_type>門店部門</org_type>
        <start_d>2011-12-28</start_d>
        <end_d></end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-4 10:32:09</insert_t>
    </org>
    <org>
        <org_id>16817</org_id>
        <parent_id>9233</parent_id>
        <org_name>512AAS.蘇州滄浪區</org_name>
        <org_code>512AAS</org_code>
        <org_type>門店部門</org_type>
        <start_d>2011-12-28</start_d>
        <end_d></end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-4 10:32:09</insert_t>
    </org>
    <org>
        <org_id>16817</org_id>
        <parent_id>9233</parent_id>
        <org_name>512AAS.蘇州滄浪區</org_name>
        <org_code>512AAS</org_code>
        <org_type>門店部門</org_type>
        <start_d>2011-12-28</start_d>
        <end_d></end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-4 10:32:09</insert_t>
    </org>
</orgs>


相關推薦

JAXBContext轉換包含集合屬性xmljava集合物件Demo

核心類: package com.jaxb; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; impo

使用XStream是實現XMLJava對象的轉換(2)--別名

name have ret lis sea sil 數組 ttr auth 五、使用別名(Alias) 首先,有這樣一段Java代碼: Java代碼 import java.util.ArrayList; import java.util.List;

使用XStream是實現XMLJava對象的轉換(6)--持久化

light 自己的 map stc title 指定 reg 對象 框架 九、持久化 在第八節的示例中,當我們操作一組對象時,我們可以指定Writer、OutputStream來寫出序列化後的XML數據,我們還可以指定Reader、InputStream來讀取序列化後的XM

使用XStream是實現XMLJava對象的轉換(5)--Object Stream

控制 () oid dex 關閉 ava -o setname otf 八,Object Stream 之前的例子我們都是直接輸出Xml成為String類型或者從String中獲得並解析Xml,現在我們要處理輸入流和輸出流! 1,輸出流(ObjectOutputStrea

xstream--xml工具類--java物件轉換JSONObject、xmljava物件互轉

工作環境: myeclipse2013、jdk1.8、fastjson1.1.41、xstream1.4.3 import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Writer;

使用XStream是實現XMLJava物件轉換(6)--持久化

九、持久化 在第八節的示例中,當我們操作一組物件時,我們可以指定Writer、OutputStream來寫出序列化後的XML資料,我們還可以指定Reader、InputStream來讀取序列化後的XML資料。當我們需要寫出和讀取檔案時都需要指定輸入輸出流,並且需要明確的呼叫輸入輸出方法來實現Java物件的序

使用XStream是實現XMLJava物件轉換(2)--別名

五、使用別名(Alias) 首先,有這樣一段Java程式碼: import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream

Java學習筆記——淺談數據結構Java集合框架(第一篇、List)

技術分享 emp 鏈表 adc 下標 -c nod nal integer 橫看成嶺側成峰,遠近高低各不同。不識廬山真面目,只緣身在此山中。               ——蘇軾 這一塊兒學的是雲裏霧裏,咱們先從簡單的入手。逐漸的撥開迷霧見太陽。本次先做List集合的三

xmljava代碼相互裝換的工具類

children ace final port 使用 || 註釋 shee turn 這是一個java操作xml文件的工具類,最大的亮點在於能夠通過工具類直接生成xml同樣層次結構的java代碼,也就是說,只要你定義好了xml的模板,就能一鍵生成java代碼。省下了自己再使

mybatis-plus中自動配置的 mapper.xmljava介面對映問題

本來沒有mybatis-plus的話,這個工作是通過mybatis-spring的MapperScan來完成的。 Mybatis-plus中的自動配置類MybatisPlusAutoConfiguration.class中有一個靜態內部類MapperScannerRegistrarN

Webservice-XMLJava(五)

處理XML一般有兩種方法,DOM和基於流。相關有很多工具,比如SAX、STAX、DOM、JDOM、DOM4J等,SAX和STAX都是基於流,前者屬於推模型,後者是拉模型,STAX為oracle公司提出基於流(stream)來處理的方式,在Java中封裝成了stax,和sax很像,在webservice中一般

xmljava物件對映

JAXB提供了XML到java物件(類)之間的相互對映(轉換),我們可以利用JAXB來消除繁瑣的XML解析工作。 下面是引用oracle網站中有關jaxb的一句話。 Now developers have another Java API at their disposal that can make i

xmljava物件之間的相互轉化

Java和xml的互相轉換,依靠強大的JAXBContext可以輕鬆實現。 下面通過一個簡單案例學習一下JAXBContext 首先準備好一個JavaBean供實驗: 注意 1、類檔案註解:@XmlRootElement不可缺少 2、2個Student的構造方法不能少

並查集(不相交集合)詳解java實現

目錄 認識並查集 並查集解析 基本思想 如何檢視a,b是否在一個集合? a,b合併,究竟是a的祖先合併在b的祖先上,還是b的祖先合併在a上? 其他路徑壓縮?

Java 集合類詳解 Java 集合類詳解

Java 集合類詳解   0.參考文獻 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合類圖 1.1 1.2   上述類圖中,實線邊框的是實現類,比

jsjava字串物件的使用

js字串物件的使用 java.lang.String 原始碼解析 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {} 是一個用 f

集合詳解】Java集合總結(下)-常用集合類對比

今天我們主要看一張圖。 圖是無意中在網上發現的,個人覺得非常好。(時間久了就忘了出處,請原創原諒~~) 我們還是從左到右分析。 ①所有的類都用到Iterator則說明所有的集合類都有遍歷集合的方法。 ②LinkedList除了繼承AbstractSe

Java集合原始碼剖析】Java集合框架

    Java集合工具包位於Java.util包下,包含了很多常用的資料結構,如陣列、連結串列、棧、佇列、集合、雜湊表等。學習Java集合框架下大致可以分為如下五個部分:List列表、Set集合、Ma

JAXB的應用之二---------Xml多個物件的對映(聚合或組合)及注意事項

   在我們的實際應用中,Xml中的結構往往不止這麼簡單,一般都會有2,3層。也就是說如果對映成物件就是聚合(組合)的情況 。 就用我們上一章的例子繼續來講,簡單我們的Book的author現在不止是一個String型別的名子,他是一個物件Author,幷包含作者的相關個人

集合詳解】Java集合總結(中)-Map家族

接上文,本篇部落格我們接著談論有關集合的內容。 java所有的集合分成三大類。Set類似罐子,把一個物件新增到Set集合時,Set集合無法記住新增這個元素的順序,所以Set裡的元素不能重複。List集合非常想一個數組,可以記住每次新增元素的順序,且List的長