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>