使用JAXB來完成Javabean與XML檔案(字串)之間的相互轉換
1. 什麼是JAXB?
JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到XML例項文件。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式繫結到Java表示,從而使得Java開發者在Java應用程式中能方便地結合XML資料和處理函式。
以上內容來自百度百科。
簡單來說,你無需再使用dom4j等對XML檔案進行繁瑣而枯燥的解析;
現在只需要針對XML文件結構設計符合規範的Javabean,就能輕鬆實現兩者間的轉換;
一旦你開始使用它,無論兩者間如何轉換,你都只需要一行程式碼,就像下面的示例一樣:
//將XML檔案轉換為實體物件
TbMessage message = (TbMessage) XmlBuilder.xmlFileToObject(TbMessage.class, "C:\\Msg.xml");
//將message物件轉換成XML字串
String xmlStr = XmlBuilder.convertToXml(message);
//將message物件轉換成檔案
File xmlFile = XmlBuilder.convertToXmlFile(message, "D:\\Msg.xml" );
//將XML字串轉換為message物件
TbMessage message2 = (TbMessage) XmlBuilder.xmlStrToObject(TbMessage.class, xmlStr);
2. 首先你需要一個工具類:XmlBuilder.java
package cn.org.j2ee.common;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.text.MessageFormat;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.apache.log4j.Logger;
/**
* 基於JAXB的XML生成器: 用於pojo與xml檔案的相互轉換
* @author wuwz
* @ClassName XmlBuilder
* @DateTime 2016年3月29日 上午10:50:17
*/
public abstract class XmlBuilder {
private final static Logger log= Logger.getLogger(XmlBuilder.class);
/**
* 將pojo轉換為XML字串
* @param object
* @return
*/
public static String convertToXml(Object object) {
Writer sw = new StringWriter();
try {
// 利用jdk中自帶的轉換類實現
JAXBContext context = JAXBContext.newInstance(object.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml輸出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 將物件轉換成輸出流形式的xml
marshaller.marshal(object, sw);
log.debug("XML字串生成成功!");
} catch (JAXBException e) {
e.printStackTrace();
} finally {
if(sw != null) {
try {
sw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sw.toString().replace("standalone=\"yes\"", "");
}
/**
* 將pojo轉換為XML檔案
* @param obj
* @param savePath
*/
public static File convertToXmlFile(Object obj,String savePath) {
File file = null;
String xmlStr = convertToXml(obj);
if(xmlStr != null && !"".equals(xmlStr)) {
file = new File(savePath);
if(!file.exists() && file.isFile()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if(file.isDirectory()) {
System.out.println(MessageFormat.format("{0}不是有效的檔案路徑.", savePath));
return null;
}
Writer writer = null;
try {
writer = new FileWriter(file);
writer.write(xmlStr);
writer.flush();
log.debug("XML檔案生成成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return file;
}
/**
* 將XML檔案轉換為指定型別的pojo
* @param clazz
* @param xmlPath
* @return
*/
public static Object xmlFileToObject(Class<?> clazz, String xmlPath) {
Object xmlObject = null;
Reader fr = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
fr = new FileReader(xmlPath);
xmlObject = unmarshaller.unmarshal(fr);
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (null != fr) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return xmlObject;
}
/**
* 將XML字串轉換為指定型別的pojo
*
* @param clazz
* @param xmlStr
* @return
*/
public static Object xmlStrToObject(Class<?> clazz, String xmlStr) {
Object xmlObject = null;
Reader reader = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 進行將Xml轉成物件的核心介面
Unmarshaller unmarshaller = context.createUnmarshaller();
reader = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(reader);
} catch (JAXBException e) {
e.printStackTrace();
} finally {
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return xmlObject;
}
}
3. 簡單的使用例子
3.1 新建一個簡單的實體
@XmlType(propOrder={
"msgId","content","createDate"
})
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Message")
public class TbMessage {
@XmlElement(name="MsgID")
private Integer msgId;
@XmlElement(name="Content")
private String content;
@XmlElement(name="CreateDate")
private Date createDate;
//省略getter setter、、
}
3.2 在Main方法中測試
public static void main(String[] args) {
TbMessage message = new TbMessage();
message.setMsgId(110);
message.setContent("這是一個測試訊息");
message.setCreateDate(new Date());
String string = XmlBuilder.convertToXml(message);
System.out.println(string);
}
3.3 輸出結果:
<?xml version="1.0" encoding="UTF-8" ?>
<Message>
<MsgID>110</MsgID>
<Content>這是一個測試訊息</Content>
<CreateDate>2016-07-20T17:20:14.380+08:00</CreateDate>
</Message>
4. 複雜DOM結構的例項
。。。待續
相關推薦
使用JAXB來完成Javabean與XML檔案(字串)之間的相互轉換
1. 什麼是JAXB? JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,
JavaBean與xml檔案的互轉——xstream
目錄 一.所需jar包 1.1.xstream.jar——互轉的基礎jar包 1.2.xmlpull.jar——JavaBean轉成xml檔案需要的jar包 1.3.xpp3-1.1.4c.jar——xml轉成JavaBean物件所需要的jar包
XStream--java對象與xml形式文件相互轉換
初始化 log style pri output 互轉 group fix drive 1.pom.xml中添加依賴 <dependency> <groupId>com.thoughtworks.xstream</gr
php中陣列與變數和字串之間的轉換
陣列函式_陣列與變數,字串之間的轉換: 1.list($var1,$val2...) 2.extract($arr, $flag) 3.compact(str1,str2...) 4.explode($delimiter, $str
SOS, 請教:XML和struct之間相互轉換的問題
現在配置基本都像XML方向轉變。那麼, 1、以前是按struct大小直接寫入檔案的,反過來,就直接按struct大小讀入struct就可以了,簡潔; 2、轉XML後,涉及到struct到xml節點之間的相互轉換,這個非常多的重複程式碼。而且太繁瑣,舉個例子,假設一個配置struct有100個欄位,
使用JAXB進行JavaBean物件與XML檔案的相互轉化
思想:父標籤相當於一個物件,子標籤相當於物件的屬性,然後迴圈巢狀。 JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。 Marshaller介面,將Java物件序列化為XML資料。 Unmarshaller介面,將XML資料反序列化為Java
Java:使用DOM4j來實現讀寫XML檔案中的屬性和元素
DOM4可以讀取和新增XML檔案的屬性或者元素 讀取屬性: public static void ReadAttributes() throws DocumentException { File file = new File("D:\\cmz\\java\\XMLTest\\Custom
Jaxb多層 java 與 xml 轉換
/** * */ package com.wonders.quartz.cocc.model.xml; import java.util.List; import javax.xml.bin
JAXB實現JAVA BEAN與XML之間的轉換
JAXB主要用來實現物件和XML之間的序列化和反序列化,關於JAXB的介紹就不多說了,網上一搜一大把,這裡主要總結下基本使用方法和一些注意事項 首先定義兩個示例類ClassA,ClassB,用於後續的示例演示 public class ClassA { pri
Jaxb實現 複雜POJO 與 xml 的轉換
Person: package com.test; import java.util.Date; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml
序列化與JavaBean與xml互轉
序列化和反序列化: 一、序列化和反序列化的概念 把物件轉換為位元組序列的過程稱為物件的序列化。 把位元組序列恢復為物件的過程稱為物件的反序列化。 物件的序列化主要有兩種用途: 1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一
用DOM4J進行xml檔案 字串 Document之間的轉換
1、xml文件或節點轉換為字串 //xml文件或節點轉換為字串 @Test public void test5()throws Exception{ //建立SAXReader物件 SAXReader read
解析xml檔案-字串分組演算法-list分頁
import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; // 找到節點修改節點內的值.elements(“節點名稱”) SAXReader reade
java關於物件(javabean)與xml之間的相互轉換
今天我們要探討的一個問題是,如何將xml格式的字串轉換成物件,以及物件轉換成xml字串。 簡介 現如今,雖然資料的傳輸大部分都是用json格式來進行傳輸,但是xml畢竟也會有一些老的專案在進行使用,身為一個萬能的程式設計師。我們又怎能不會使
java反射與xml檔案解析
在專案開發的過程中,遇到了要將日誌匯出為xml格式和將xml匯入到日誌資料庫中的功能需求,因為專案中存在多種日誌形式(這聽起來很奇葩是不是?),我實在懶得為每一種日誌都寫一個方法。想到在開始的設計過程中,將每種的日誌都對映為一個pojo,故想到了java的反射機制,
關於圖片與XML檔案相互轉化
{ XmlTextReader readxml=new XmlTextReader(xmlfilepath); int len=64*1024; byte[] bytebmp=newbyte [len]; while (r
請編寫相關函式來完成對一段英文字串進行字母統計功能,出現最多那個字母的出現次數,不區分大小寫。
思路:1、對字串進行過濾,把英文字母過濾出來。2、將所有英文字母統一轉成小寫(大寫)。3、將待求的字串與26個字母進行比較並統計個數4、統計出現最多的字母。原始碼:#include <stdio.h>#include <stdlib.h>#includ
Struts2核心檔案配置與 xml檔案配置基礎版
struts框架必備的三個要素: 1.xml檔案配置: xml檔案配置主要為一個過濾器的配置:StrutsPrepareAndExecuteFilter; 該過濾器為struts預設為我們實現好了的;所以在xml檔案中直接配置,不用去自己建過濾器filter; 配置如下:
【C# MVC工具類】DataSet/DataTable 與Xml檔案的互相轉化
無論做介面還是出於某種目的緩解伺服器壓力的時候,我們喜歡用xml檔案去做,這樣簡化了很多操作。但是在C#中如何操作呢? 一:DataSet/Datatable讀取xml檔案。 這個很簡單了,C#直接提供了api,我們直接呼叫就可以了: Data
XStream實現javabean與xml之間相互轉換
XStream是thoughtworks公司釋出的一個簡單的Java類庫,用於將JavaBean序列化為XML,並且能夠將XML檔案反向轉換為JavaBean. 例項: user.java impor