1. 程式人生 > >使用JAXB來完成Javabean與XML檔案(字串)之間的相互轉換

使用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完成JavabeanXML檔案(字串)之間相互轉換

1. 什麼是JAXB? JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,

JavaBeanxml檔案的互轉——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 BEANXML之間轉換

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

序列化JavaBeanxml互轉

序列化和反序列化: 一、序列化和反序列化的概念   把物件轉換為位元組序列的過程稱為物件的序列化。   把位元組序列恢復為物件的過程稱為物件的反序列化。   物件的序列化主要有兩種用途:   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實現javabeanxml之間相互轉換

XStream是thoughtworks公司釋出的一個簡單的Java類庫,用於將JavaBean序列化為XML,並且能夠將XML檔案反向轉換為JavaBean. 例項: user.java impor