使用JAXB讀寫xml


1.注解

在Java模型中的創建與 xml 文件對應的節點和屬性需要用注解來表示

@XmlRootElement

作用:將一個Java類映射為一段XML的根節點參數:
    name  定義這個根節點的名稱
    namespace   定義這個根節點命名空間
@XmlAccessorType  
作用:定義映射這個類中的何種類型需要映射到XML。
可接收四個參數,分別是:
    XmlAccessType.FIELD:表示將這個類中的 非靜態(static)、非序列化(transient)屬性映射到xml,有無get/set方法均可
    XmlAccessType.PROPERTY:使用 set/get 方法來序列化屬性或者元素(get方法可不需注解自動映射)——說明:通過get方法映射到xml,get方法上是否添加注解都可,但是不能在屬性上添加注解
    XmlAccessType.PUBLIC_MEMBER:將這個類中的所有public的field(字段)或property(get/set對)同時映射到XML(默認注解),該注解包含了XmlAccessType.FIELD和XmlAccessType.PROPERTY兩個注解,所以注意不要對同一個字段添加兩次注解
    XmlAccessType.NONE:不映射
補充說明:
    @XmlAccessorType的默認訪問級別是 XmlAccessType.PUBLIC_MEMBER,因此,如果java對象中的private成員變量設置了public權限的 getter/setter方法,就不要在private變量上使用@XmlElement和@XmlAttribute注解,否則在由java對象生成 xml時會報同一個屬性在java類里存在兩次的錯誤。
    同理,如果@XmlAccessorType的訪問權限為XmlAccessType.NONE, 如果在java的成員變量上使用了@XmlElement或@XmlAttribute注解,這些成員變量依然可以映射到xml文件。
@XmlElements
// 表示或的關系,list集合中內容可以為以下兩種類型
    @XmlElements({
        @XmlElement(name = "Person", type = Person.class),
        @XmlElement(name = "String", type = String.class)
    })
    private List list;
補充說明:如果List使用泛型,則List集合中只能含有一種數據類型,此時使用該注解無用。
@XmlElement  
作用:指定一個字段或get/set方法映射到XML的節點。如,當一個類的XmlAccessorType 被標注為PROPERTY時,在某一個沒有get/set方法的字段上標注此注解,即可將該字段映射到XML。
參數:
    defaultValue        指定節點默認值
    name            指定節點名稱
    namespace        指定節點命名空間
    type                定義該字段或屬性的關聯類型
    required            是否必須(默認為false)
    nillable            該字段是否包含 nillable="true" 屬性(默認為false)
@XmlAttribute
作用:指定一個字段或get/set方法映射到XML的屬性(區別@XmlElement——節點)。
參數:
    Name            指定屬性名稱
    namespace        指定屬性命名空間
    required         是否必須(默認為false)
@XmlTransient  
作用:定義某一字段或屬性不需要被映射為XML。
如,當一個類的XmlAccessorType 被標注為PROPERTY時,在某一get/set方法的字段上標注此注解,那么該屬性則不會被映射。
@XmlType  
作用:定義映射的一些相關規則
參數:
    propOrder        指定映射XML時的節點順序
    factoryClass        指定UnMarshal時生成映射類實例所需的工廠類,默認為這個類本身
    factoryMethod    指定工廠類的工廠方法
    name            定義XML Schema中type的名稱
    namespace        指定Schema中的命名空間
@XmlElementWrapper  
作用:為數組元素或集合元素定義一個父節點。
如,類中有一元素為List items,若不加此注解,該元素將被映射為
    <items>...</items>
    <items>...</items>
這種形式,此注解可將這個元素進行包裝,如:
    @XmlElementWrapper(name="items")
    @XmlElement(name="item")
    public List items;
將會生成這樣的XML樣式:
    <items>
        <item>...</item>
        <item>...</item>
    </items>
@XmlJavaTypeAdapter  
作用:自定義某一字段或屬性映射到XML的適配器。
如,類中包含一個接口,我們可以定義一個適配器(繼承自 javax.xml.bind.annotation.adapters.XmlAdapter類),指定這個接口如何映射到XML。
@XmlSchema
作用:配置整個包的namespace,這個注解需放在package-info.java文件中  


2.代碼實例
2.1 Object轉為xml

 1 public static void marshallerByJaxb(String path, Object object) {
 2     try {
 3         JAXBContext jc = JAXBContext.newInstance(object.getClass());
 4             
 5         Marshaller marshaller = jc.createMarshaller();            
 6         marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 編碼格式
 7         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
 8         marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xml頭聲明信息
 9 
10         File file = new File(path);
11         if (!file.exists()) {
12             file.createNewFile();
13         }
14         marshaller.marshal(object, file);
15     } catch (JAXBException e) {
16         e.printStackTrace();
17     } catch (IOException e) {
18         e.printStackTrace();
19     }
20 }

 


2.2 xml轉為Object

 1 public static void unmarshallerByJaxb(String path, Object object) {
 2     try {
 3         JAXBContext jc = JAXBContext.newInstance(object.getClass());
 4             
 5         Unmarshaller unmarshaller = jc.createUnmarshaller();
 6             
 7         File file = new File(path);
 8         if (!file.exists()) {
 9             throw new FileNotFoundException("Can not load xml file!");
10         }
11             
12         unmarshaller.unmarshal(file);
13     } catch (JAXBException e) {
14         e.printStackTrace();
15     } catch (FileNotFoundException e) {
16         e.printStackTrace();
17     }
18 }

 


說明:傳參時傳入的obj必須為具體類型。
如:先實例化Person per = new Person();
再傳unmarshallerByJaxb(path, person);
不可以直接unmarshallerByJaxb(path, Person.class);

3. List、Map集合類型說明
集合必須封裝在對象內部才能使用jaxb轉為xml,不能直接將集合直接轉為xml
3.1 List
List集合或數組只要封裝到對象內部,使用@XMLElementWrapper注解
說明:當對象內部只有一個List集合的屬性時,可以不加@XMLElementWrapper注解增加一層節點,直接將List結合內的對象作為根節點下的二級節點即可。
3.2 Map
如:Map<String, Person>集合,Person為自定義的一個對象
1.創建一個新對象(如:AllPerson)作為中轉對象,該對象內含有兩個屬性,分別是String和Person類型的(前者為Map的key,后者為Map的value);
2.使用@XMLJavaTypeAdapter注解將Map<String, Person>轉為AllPerson[],數組的大小與Map的大小相同;
總結:XmlAdapter中的兩個方法各有用處,注意不要漏掉
Object->xml時
Map<String, Person>—轉為—> AllPerson[](AllPerson對象中包含String, Person)
Xml->Object時
AllPerson[](AllPerson對象中包含String, Person)—轉為—> Map<String, Person>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM