1. 程式人生 > >Java 中Xml與物件的互轉

Java 中Xml與物件的互轉

在java開發中我們經常會遇到Xml與物件互相轉換的情況,尤其是針對WebService訪問時會涉及到xml與物件的轉換問題。目前可以用於xml與物件互轉的方式有很多這裡採用jdk自帶的JAXB來進行。
對於jaxb的介紹我就不用過多的介紹了,網上這方面的資料非常多我這裡就是介紹如何利用jaxb來實現java物件與xml彼此之間轉換的問題。
我們還是參照程式碼來進行講解,程式碼環境

spring boot

首先我們看我們有這麼一個xml字串

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user
>
<userid>972a716fcfde4e098fda9bde13f8d31d</userid><username>a001</username><realname>江文軒</realname></user>

那麼我們要定義一個類同時這個類中的資料要與xml字串中的屬性進行對應

package com.spring.storeage.entity;

import javax.persistence.*;
import javax.xml.bind.annotation.*;
import java.util.Objects;

/**
 * com.spring.entity
 * @author
chengjian * 2017/12/23 **/
@Entity @Table(name = "user", schema = "spring", catalog = "") @XmlRootElement(name = "user") @XmlType(propOrder = {"userid","username","userpwd","realname"}) public class UserEntity { private String userid; private String username; private String userpwd; private
String realname; @Id @Column(name = "userid", nullable = false, length = 50) @XmlElement(name = "userid") public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } @Basic @Column(name = "username", nullable = false, length = 50) @XmlElement(name = "username") public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Basic @Column(name = "userpwd", nullable = false, length = 50) @XmlElement(name = "userpwd") public String getUserpwd() { return userpwd; } public void setUserpwd(String userpwd) { this.userpwd = userpwd; } @Basic @Column(name = "realname", nullable = true, length = 200) @XmlElement(name = "realname") public String getRealname() { return realname; } public void setRealname(String realname) { this.realname = realname; }

在程式碼中主要有這麼些註解

@XmlRootElement(name = “user”)
@XmlType(propOrder = {“userid”,”username”,”userpwd”,”realname”})
@XmlElement(name = “userid”)

首先@XmlRootElement(name = “user”)這個註解必須放在類宣告上,這說明了我們將這個類定義為可以與xml互相轉換,同時生成的xml根元素名稱叫user這與前面看到的xml字串中的內容一致。
然後我們又添加了這麼一個註解@XmlType(propOrder = {“userid”,”username”,”userpwd”,”realname”})這個註解我這裡標記的是生成的xml字串中屬性的排序,如果不新增propOrder那麼生成的xml字串中各屬性將是亂序的。
@XmlElement(name = “userid”)這個註解說明將userid欄位對映到生成xml字串中的useid屬性中
這樣我們就完成了實體上的定義,下面我們就看具體的轉換方法,很多時候我們都是將轉換方法設定為工具類,所以我定義了一個工具類作為轉換方法的載體,看下面程式碼

package com.spring.util;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamResult;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * @author chengjian
 * xml與實體物件轉換工具類
 */
public class XmlUtil {

    /**
     * xml字串轉換為實體物件
     * @param xml
     * @param clazz
     * @return
     */
    public static Object toObject(String xml,Class clazz) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            StringBuffer xmlStr = new StringBuffer( xml );
            StringReader reader = new StringReader(xmlStr.toString());
            Object obj = unmarshaller.unmarshal(reader);
            return obj;
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 實體物件轉換為xml字串
     * @param obj
     * @param clazz
     * @return
     */
    public static String toXmlString(Object obj,Class clazz) {
        String xmlString = "";
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Marshaller marshaller = context.createMarshaller();
            StringWriter writer=new StringWriter();
            marshaller.marshal(obj,new StreamResult(writer));
            xmlString=writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlString;
    }
}

上面的程式碼可以直接進行使用,下面我們編寫實際的測試程式碼

@Test
    public void xmlTest(){
        Faker faker=new Faker(new Locale("zh-CN"));
        //建立實體物件
        UserEntity user=new UserEntity();
        user.setUserid(CommonUtil.getUuid());
        user.setUsername("a001");
        user.setRealname(faker.name().fullName());
        //將實體物件轉換為xml字串
        String xmlString= XmlUtil.toXmlString(user,UserEntity.class);
        System.out.println(xmlString);
        //建立檔案實體
        FileEntity fileEntity=new FileEntity();
        fileEntity.setFileid(user.getUsername());
        fileEntity.setFileext("xml");
        fileEntity.setFilename(user.getUsername());
        fileEntity.setFiledata(xmlString.getBytes());
        //將xml字串儲存到相應的xml檔案中
        fileSystemStorageService.store(fileEntity);
        try {
            //測試從xml檔案中讀取xml字串
            String fileContent=new String(Files.readAllBytes(fileSystemStorageService.load("a001.xml")));
            System.out.println("read from file");
            System.out.println(fileContent);
            //將讀取到的xml字串轉化成實體
            UserEntity usser1=(UserEntity) XmlUtil.toObject(fileContent,UserEntity.class);
            System.out.println(usser1.getUsername());
            System.out.println(usser1.getRealname());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

通過上面的程式碼就能基本完成實體物件與xml之間的互相轉換,詳細程式碼參見
spring

相關推薦

Java Xml物件

在java開發中我們經常會遇到Xml與物件互相轉換的情況,尤其是針對WebService訪問時會涉及到xml與物件的轉換問題。目前可以用於xml與物件互轉的方式有很多這裡採用jdk自帶的JAXB來進行。 對於jaxb的介紹我就不用過多的介紹了,網上這方面的資料

Javanet.sf.json包關於JSON物件的坑

在Web開發過程中離不開資料的互動,這就需要規定互動資料的相關格式,以便資料在客戶端與伺服器之間進行傳遞。資料的格式通常有2種:1、xml;2、JSON。通常來說都是使用JSON來傳遞資料。本文正是介紹在Java中JSON與物件之間互相轉換時遇到的幾個問題以及相

JSONUtil(JAVA對象/Listjsonxmljson)

transpose boolean ngs final span arraylist setname clas pro 1 package com.chauvet.utils.json; 2 3 import java.io.BufferedReader;

java 利用 ObjectMapper 進行jsonString物件

先在專案內引入包。 gradle: dependencies { compile( "com.fasterxml.jackson.core:jackson-datab

Jackson之String物件

public class JacksonTest { //配置ObjectMapper物件 private static final ObjectMapper objectMapper = new ObjectMapper() .configure(Dese

pythonstrlist

1、list轉str 假設有一個名為test_list的list,轉換後的str名為test_str 則轉換方法: test_str = "".join(test_list) 需要注意的是該方法需要list中的元素為字元型,若是整型,則需要先轉換為字元型後再轉為str型別。

Jackson使用:String 物件、Jackson 從 json 字串轉換出物件

一、從json字串轉換出物件 Pager類: import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown=true) public class Pager

Json工具類,使用正則支援xmljson

1. xml轉json 具體就不多說了,我是採用的笨方法,多次使用正則進行替換的。比較好的一點兒是支援xml元素屬性。如果xml節點有屬性會使用 @attributes:{屬性列表} 進行格式化處理。如果有屬性只有一個值,那值要採用@value:"值"進行格式化。程式碼如下:

java base64字元圖片

import java.io.FileInputStream;   import java.io.FileOutputStream;   import java.io.IOException; &nbs

Pythonrgbycbcr

mat = np.array( [[ 65.481, 128.553, 24.966 ], [-37.797, -74.203, 112.0 ], [ 112.0, -9

Java物件的關係區別

什麼是類?類就是具備某些共同特徵的實體的集合,它是一種抽象的資料型別,它是對所具有相同特徵實體的抽象。在面向物件的程式設計語言中,類是對一類“事物”的屬性與行為的抽象。什麼是物件?物件就是一個真實世界中的實體,物件與實體是一一對應關係的,意思就是現實世界的每一個實體都是一個物

java虛擬機器系列】java物件的載入順序

首先了解一下Java虛擬機器初始化的原理。JVM通過加裝、連線和初始化一個Java型別,使該型別可以被正在執行的Java程式所使用。型別的生命週期如下圖所示: 裝載和連線必須在初始化之前就要完成。 類初始化階段,主要是為類變數賦予正確的初始值。這裡的“正確”初始值指的是程

xmldatatable

DataTable轉Xml --dt為已獲得的DataTable StringBuilder xml = new StringBuilder(); XmlWriter writer = XmlWriter.Create(xml); XmlSerializer seriali

java實現ascii中文

package com.xingxd.study.test;     import java.io.File;   import java.io.FileWriter;   import java.io.IOException;   import java.io.Print

怎麼去理解JAVA物件的關係

首先要明確,在現實生活中,每一個物體都有自己的基本特徵,專業一點也可以說成是屬性有些甚至還有一定的行為。例如 汽車的特徵:有車門、有輪胎、顏色各一等等,行為:有行駛,開車門,開車燈,等等。有這些屬性和行為的東西,我們就可以把它稱之為“汽車”。那麼在java語言中對現實生活中的

Java中文字串unicode工具類

原理利用了java實現js的escape以及unescape函式。 /** * 中文字串和unicode互轉工具類 <br> * * @author hkb <br> */ public class UnicodeConver

MFCUTF8GB2312

 UTF8轉GB2312 CString CMyBrowserDlg::ConvertUTF8toGB2312(CString str) {     int len = str.GetLength

springMVC4(4)json物件例項解析請求響應資料轉換器

格式化資料輸入輸出 Spring3.0的重要介面:HttpMessageConveter為我們提供了強大的資料轉換功能,將我們的請求資料轉換為一個java物件,或將java物件轉化為特定格式輸出等。比如我們常見的從前端登錄檔單獲取json資料並轉化為User物

Java】ASCII字母(程式碼整理)

ASCII(American Standard Code for Information Interchange,美國資訊交換標準程式碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。 這是我轉換的程式碼工具類 package test; /**

Java物件的概念區別

 Java是一種面向物件的程式設計語言(Object Oriented Programming:OOP),面向物件的程式設計語言中有類和物件的概念,它們在概念上有什麼區別呢?   這往往是一個令面向物件的初學者感到迷惑的問題。      下面的解說雖然針對的是Java語