JAXB 實現Java和xml的互相轉換
下面是 轉於 : https://blog.csdn.net/qq383264679/article/details/52231128 感謝博主
首先介紹下什麼是JAXB?
JAXB(Java Architecture for XML Binding) 是一項可以根據XML Schema產生Java類的技術。 該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到 XML例項文件。Jaxb 2.0是JDK 1.6的組成部分。我們不需要下載第三方jar包 即可做到輕鬆轉換。
JAXB的核心類有如下三個:
JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。
該類不能直接建立,只能使用如下方式進行例項化JAXBContext物件:
Marshaller介面,將Java物件序列化為XML資料。
該類是設定轉換為XML資料的熟悉如格式化輸出xml,裝置xml的編碼格式等:
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);
Unmarshaller介面,將XML資料反序列化為Java物件。
反序列化java物件需要用到的例項:
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
使用JAXB常用的註解如下:
- @XmlType,將Java類或列舉型別對映到XML模式型別
- @XmlAccessorType(XmlAccessType.FIELD) ,控制欄位或屬性的序列化。FIELD表示JAXB將自動繫結Java類中的每個非靜態的(static)、非瞬態的(由@XmlTransient標 注)欄位到XML。其他值還有XmlAccessType.PROPERTY和XmlAccessType.NONE。
- @XmlAccessorOrder,控制JAXB 繫結類中屬性和欄位的排序。
- @XmlJavaTypeAdapter,使用定製的介面卡(即擴充套件抽象類XmlAdapter並覆蓋marshal()和unmarshal()方法),以序列化Java類為XML。
- @XmlElementWrapper ,對於陣列或集合(即包含多個元素的成員變數),生成一個包裝該陣列或集合的XML元素(稱為包裝器)。
- @XmlRootElement,將Java類或列舉型別對映到XML元素。
- @XmlElement,將Java類的一個屬性對映到與屬性同名的一個XML元素。
- @XmlAttribute,將Java類的一個屬性對映到與屬性同名的一個XML屬性。
下面是轉於博主: https://blog.csdn.net/y534560449/article/details/73250062
@XmlRootElement
public class Man {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Java 轉換 Xml:
@Test
public void testJava2Xml(){
try {
JAXBContext jc = JAXBContext.newInstance(Man.class);
Marshaller ms = jc.createMarshaller();
Man man = new Man("man",100);
ms.marshal(man, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
Xml 轉換 Java:
@Test
public void testXml2Java() throws JAXBException{
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Man><age>100</age><name>man</name></Man>";
JAXBContext jc = JAXBContext.newInstance(Man.class);
Unmarshaller unmar = jc.createUnmarshaller();
Man man = (Man) unmar.unmarshal(new StringReader(xml));
System.out.println(man.getName());
}
下面是原創:(將Java 轉成 XML)
public class XmlUtil {
/**
* 將物件直接轉換成String型別的 XML輸出
*
* @param obj
* @return
*/
public static String convertToXml(Object obj) {
// 建立輸出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自帶的轉換類實現
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml輸出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
// 將物件轉換成輸出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
return sw.toString();
}
/**
* 將物件根據路徑轉換成xml檔案
*
* @param obj
* @param path
* @return
*/
public static void convertToXml(Object obj, String path) {
try {
// 利用jdk中自帶的轉換類實現
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml輸出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
// 將物件轉換成輸出流形式的xml
// 建立輸出流
FileWriter fw = null;
try {
fw = new FileWriter(path);
} catch (IOException e) {
e.printStackTrace();
}
marshaller.marshal(obj, fw);
} catch (JAXBException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
/**
* 將String型別的xml轉換成物件
*/
public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 進行將Xml轉成物件的核心介面
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
@SuppressWarnings("unchecked")
/**
* 將file型別的xml轉換成物件
*/
public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
FileReader fr = null;
try {
fr = new FileReader(xmlPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
xmlObject = unmarshaller.unmarshal(fr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
public static void main(String[] args) {
List<Staff> staffs = new ArrayList<Staff>();
Staff stf = new Staff();
stf.setName("周星馳");
stf.setAge(40);
stf.setSmoker(true);
staffs.add(stf);
Staff stf1 = new Staff();
stf1.setAge(40);
stf1.setSmoker(true);
staffs.add(stf1);
Department dept = new Department();
dept.setName("娛樂圈");
dept.setStaffs(staffs);
System.out.println(new XmlUtil().convertToXml(dept));
}
}