1. 程式人生 > >java關於物件(javabean)與xml之間的相互轉換

java關於物件(javabean)與xml之間的相互轉換

今天我們要探討的一個問題是,如何將xml格式的字串轉換成物件,以及物件轉換成xml字串。

簡介

現如今,雖然資料的傳輸大部分都是用json格式來進行傳輸,但是xml畢竟也會有一些老的專案在進行使用,身為一個萬能的程式設計師。我們又怎能不會使用它呢?正常的老式方法是通過獲取節點來進行一系列操作,個人感覺太過於複雜、繁瑣。今天推薦一套簡單的api。XStream類。好了廢話不多說,直接上程式碼。(為了講述的更加清晰。我們全程不使用任何註解,只調用api來達到效果。在理解了原理的情況下看下註解的語法即會使用)

物件轉xml

首先我們從簡單的物件轉xml為例來進行講解,因為xml轉物件會相對複雜,我們由淺到深。

第一步:匯入jar包,本人專案以gradle搭建。jar包下載引用如下(普通專案從網上找一下jar包放到lib資料夾下即可)

compile(“com.thoughtworks.xstream:xstream:1.4.10”)

第二步:建立物件(建立User與Customer,不要被名字誤導。。。沒什麼關係)

1.建立User物件(使用lombok建立getset方法,不瞭解的同學直接手動建立即可)

package com.kingboy.springboot.domain.dto;

import lombok.Data;

import java.util.List;

/**
 * Created by beyondLi on 2017/6/14.
 */
@Data public class User { private String name; private Integer age; private List<Customer> customer; }

2.建立Customer物件(同上)

package com.kingboy.springboot.domain.dto;

import lombok.Data;

/**
 * Created by beyondLi on 2017/6/14.
 */
@Data
public class Customer {
    private String commodity;
}

第三步:測試類

        //建立user物件與customer物件並賦值
        User user = new User();
        Customer customer1 = new Customer();
        Customer customer2 = new Customer();
        customer1.setCommodity("商品1");
        customer2.setCommodity("商品2");
        List<Customer> list = new ArrayList<>();
        list.add(customer1);
        list.add(customer2);
        user.setName("beyondLi");
        user.setAge(23);
        user.setCustomer(list);
        //建立xStream物件
        XStream xStream = new XStream();
        //呼叫toXML 將物件轉成字串
        String s = xStream.toXML(user);
        System.out.println(s);

第四步:輸出結果

這裡寫圖片描述

第五步:優化

上述我們看到了結果,但是貌似和我們想要的不太一樣呀,怎麼有些是全路徑名稱呢?這裡解決方法很簡單。主要講思路。因為關係到xml轉物件時候封裝是否報錯的問題。預設情況下當物件沒有名字的時候,例如最一開始的物件 以及物件中的集合型別中泛型的型別,這些我們都沒辦法給他起名字的,預設情況下它是全路徑名稱。所以如果我們不處理,當xml轉物件的時候傳來的xml直接都是名字,而我們如果直接呼叫api封裝就會出現因為名字不一致所以封裝失敗而報錯的問題。所以我們要給全路徑名稱的類起別名(注!最好不要無腦性的給所有物件都起別名,雖然也可以解決問題。但是我們最好理解透徹,只給有需要的類起別名),程式碼如下

        //建立user物件與customer物件並賦值
        User user = new User();
        Customer customer1 = new Customer();
        Customer customer2 = new Customer();
        customer1.setCommodity("商品1");
        customer2.setCommodity("商品2");
        List<Customer> list = new ArrayList<>();
        list.add(customer1);
        list.add(customer2);
        user.setName("beyondLi");
        user.setAge(23);
        user.setCustomer(list);
        //建立xStream物件
        XStream xStream = new XStream();
        //給指定類起別名
        xStream.alias("User",User.class);
        xStream.alias("Customer",Customer.class);
        //呼叫toXML 將物件轉成字串
        String s = xStream.toXML(user);
        System.out.println(s);

結果:
這裡寫圖片描述

希望閱讀到這裡的同學將上面那個起別名理解清楚,什麼時候起別名,什麼時候不需要起別名,這樣才能在xml轉物件的時候不出現任何的偏差和錯誤。

XML轉物件

第一步:匯入jar包。同上

第二步:建立User與Customer物件。同上

第三部 : 測試類

首先我們展示一下上面提示的不起別名報錯問題,我模擬了一個xml型別的字串,但是不起別名

        //模擬一個xml格式字串
        String xml = "<user>\n" +
                "  <name>beyondLi</name>\n" +
                "  <age>23</age>\n" +
                "  <customer>\n" +
                "    <Customer>\n" +
                "      <commodity>商品1</commodity>\n" +
                "    </Customer>\n" +
                "    <Customer>\n" +
                "      <commodity>商品2</commodity>\n" +
                "    </Customer>\n" +
                "  </customer>\n" +
                "</user>";
        //建立xStream物件
        XStream xstream = new XStream();
        //起別名,先不寫,讓其報錯
        User user2 = (User) xstream.fromXML(xml);
        System.out.println(user2);

結果
這裡寫圖片描述

和明顯,雖然我們物件user和customer起名字都沒有錯誤。但是報錯說找不到。這個報錯結合上面的物件轉xml的結果。我們就可以明顯的看出問題出在了哪裡。

正確程式碼如下

        //模擬一個xml格式字串
        String xml = "<user>\n" +
                "  <name>beyondLi</name>\n" +
                "  <age>23</age>\n" +
                "  <customer>\n" +
                "    <Customer>\n" +
                "      <commodity>商品1</commodity>\n" +
                "    </Customer>\n" +
                "    <Customer>\n" +
                "      <commodity>商品2</commodity>\n" +
                "    </Customer>\n" +
                "  </customer>\n" +
                "</user>";
        //建立xStream物件
        XStream xstream = new XStream();
        //將別名與xml名字相對應
        xstream.alias("user", User.class);
        xstream.alias("Customer", Customer.class);
        User user2 = (User) xstream.fromXML(xml);
        System.out.println(user2);

結果:
這裡寫圖片描述
轉換成功

其實xml與物件之間的相互轉換並沒有難度,但是經常出錯和不成功其實就是因為在別名上的問題。而導致無法匹配。希望這篇文當可以幫助更多的同學解決問題。

以上觀點僅是個人理解。如有錯誤或不完善,還望指出,共同成長

相關推薦

XStream實現javabeanxml之間相互轉換

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

java關於物件(javabean)xml之間相互轉換

今天我們要探討的一個問題是,如何將xml格式的字串轉換成物件,以及物件轉換成xml字串。 簡介 現如今,雖然資料的傳輸大部分都是用json格式來進行傳輸,但是xml畢竟也會有一些老的專案在進行使用,身為一個萬能的程式設計師。我們又怎能不會使

使用jaxb 實現物件xml之間轉換,並且是 soap報文物件轉換

使用jaxb 實現物件與xml之間的轉換,並且是 soap報文與物件轉換 1.測試用例 public class TestJaxb { @Test public void testToObject(){ JaxbBinder jaxbBinder = new Jax

JAXB實現JAVA BEANXML之間轉換

JAXB主要用來實現物件和XML之間的序列化和反序列化,關於JAXB的介紹就不多說了,網上一搜一大把,這裡主要總結下基本使用方法和一些注意事項 首先定義兩個示例類ClassA,ClassB,用於後續的示例演示 public class ClassA { pri

Java中DateString的相互轉換

獲取 org 復制 日期類型 junit clas 時間 -m see 我們在註冊網站的時候,往往需要填寫個人信息,如姓名,年齡,出生日期等,在頁面上的出生日期的值傳遞到後臺的時候是一個字符串,而我們存入數據庫的時候確需要一個日期類型,反過來,在頁面上顯示的時候,需要從數據

【UML】Java代碼UML模型相互轉換方法

pap ref through 沒有 src 設計模式 ron 建模工具 好用 最近重溫了幾個設計模式,看到大家的博客裏面都是Java代碼+UML視圖,UML表達整體框架,然後再秀出具體的代碼,點面結合、一目了然。所以也研究了一下Java代碼與UML模型相互轉換方法。

JAVA方法 字串unicode的相互轉換

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

base64編碼圖片之間相互轉換

Base64是網路上最常見的用於傳輸8Bit位元組碼的編碼方式之一 一、將base64轉換成圖片 只需要在img 標籤中引入即可,注意要加上標明字首(data:image/png;base64),否則並不知道,這串程式碼是幹啥的 如: 二、將圖片轉換成base64 通過ca

利用 JDK 自帶的 org.w3c.dom 進行物件, map xml 的互相轉換

利用 JDK 自帶的 org.w3c.dom 進行物件,map 與 xml 的簡單互相轉換, 其中用到了一個工具類 Hutools 下面是hutools的maven依賴 <dependency> <groupId>cn.hutool</groupId> <arti

java的json字串之間轉換

import java.io.IOException; import org.springframework.util.StringUtils; import com.f

MapXML相互轉換

工具類: public class XmlUtils { /** * 功能描述: Map 轉 Xml字串 */ public static String map2Xml(Map<String , String>

JavaBeanMap的相互轉換

package com.bizvane.utils.tools; import java.lang.reflect.Field; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; impor

DataTable 實體之間相互轉換

一:ConvertDataTableToModel: 主要將DataTable中改動的內容同步到實體類集合中 /// <summary> /// 將DB中改動的內容同步到泛型集合中 /// </summary>

實現JOSNXml相互轉換

現在主流的資料格式為Json格式,但是我們如果對接銀行等金融方面的介面這時候就會必須要求我們格式為Xml格式的報文,這個時候我們如何解決呢? 程式碼如下: <d

JAXB工具實現java實體類和xml之間轉換

<?xml version="1.0" encoding="GBK" standalone="yes"?> <student> <id>1</id> <name>羅志茂</name> <age>25

JAVA中時間字串的相互轉換(工具類)

<span style="font-size:24px;">//model為字串的時間格式,如"<span style="font-family: arial; line-heigh

java中字串陣列之間轉換

做題目時候遇到了這個問題,如何將字串轉換成陣列,翻閱資料得到了答案。 (1)字元轉轉陣列 字串不是陣列,但是字串可以轉換成陣列,反之亦然。為了將字串轉換成一個字元陣列,可以使用String類的toCh

JAVA中子類父類相互轉換

子類轉換成父類:可以。 父類轉換成子類:不可以。 如果父類物件的引用指向的實際是一個子類的物件,那麼父類物件的引用可以強制轉化成子類物件的引用。如: Parent p=new Son() Son s=(Son)p;

java實體類和xml之間轉換

一、XStream的用途          XStream是一個Java物件和XML相互轉換的工具,很好很強大。提供了所有的基礎型別、陣列、集合等型別直接轉換的支援。           因此XML常用於資料交換、物件序列化(這種序列化和Java物件的序列化技術有著本質的區別)。         S

JAXB 實現beanxml之間轉換

之前一直用dom解析xml,在生成和解析的過程中都有點麻煩,最近又學習了JAXB解析xml ,並且很方便的實現javaBean 與xml 的互轉,很不錯,直接看效果: 實體類如下: package xmlTest; import javax.xml.bind.