最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中xml和對(duì)象之間的互相轉(zhuǎn)換方法

 更新時(shí)間:2023年06月26日 10:01:22   作者:懟懟_bml  
在java開(kāi)發(fā)中我們經(jīng)常會(huì)遇到Xml與對(duì)象互相轉(zhuǎn)換的情況,這篇文章主要給大家介紹了關(guān)于java中xml和對(duì)象之間的互相轉(zhuǎn)換方法,文中給出了兩種解決方法,需要的朋友可以參考下

例子是把xml映射成bean成對(duì)象

<?xml version="1.0" encoding="UTF-8"?>
<c c1="0">
    <d d1="101280101" d2="重慶" d3="nanping" d4="南坪"/>
    <d d1="101280102" d2="重慶" d3="yubei" d4="渝北"/>
    <d d1="101280103" d2="重慶" d3="dadukou" d4="大渡口"/>
</c>

第一種方法是使用 JAXB(Java Architecture for XML Binding) 實(shí)現(xiàn)XML與Bean的相互轉(zhuǎn)換

簡(jiǎn)介

JAXB是一個(gè)業(yè)界的標(biāo)準(zhǔn),是一項(xiàng)可以根據(jù)XML Schema產(chǎn)生Java類的技術(shù)。該過(guò)程中,JAXB也提供了將XML實(shí)例文檔反向生成Java對(duì)象樹(shù)的方法,并能將Java對(duì)象樹(shù)的內(nèi)容重新寫(xiě)到 XML實(shí)例文檔。

Jaxb 2.0是JDK 1.6的組成部分。我們不需要下載第三方j(luò)ar包 即可做到輕松轉(zhuǎn)換。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即將轉(zhuǎn)換的JavaBean中添加annotation注解。

重要的使用有:

  • JAXBContext類,是應(yīng)用的入口,用于管理XML/Java綁定信息。
  • Marshaller接口,將Java對(duì)象序列化為XML數(shù)據(jù)。
  • Unmarshaller接口,將XML數(shù)據(jù)反序列化為Java對(duì)象。
  • @XmlType,將Java類或枚舉類型映射到XML模式類型
  • @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或?qū)傩缘男蛄谢?code>FIELD表示JAXB將自動(dòng)綁定Java類中的每個(gè)非靜態(tài)的(static)、非瞬態(tài)的(由@XmlTransient標(biāo) 注)字段到XML。其他值還有XmlAccessType.PROPERTYXmlAccessType.NONE。
  • @XmlAccessorOrder,控制JAXB 綁定類中屬性和字段的排序。
  • @XmlJavaTypeAdapter,使用定制的適配器(即擴(kuò)展抽象類XmlAdapter并覆蓋marshal()和unmarshal()方法),以序列化Java類為XML。
  • @XmlElementWrapper ,對(duì)于數(shù)組或集合(即包含多個(gè)元素的成員變量),生成一個(gè)包裝該數(shù)組或集合的XML元素(稱為包裝器)。
  • @XmlRootElement,將Java類或枚舉類型映射到XML元素。
  • @XmlElement,將Java類的一個(gè)屬性映射到與屬性同名的一個(gè)XML元素。
  • @XmlAttribute,將Java類的一個(gè)屬性映射到與屬性同名的一個(gè)XML屬性。

city的bean

import lombok.Data;
 
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
 
 
@Data
//根元素
@XmlRootElement(name = "d")
//訪問(wèn)類型,通過(guò)字段
@XmlAccessorType(XmlAccessType.FIELD)
public class City {
 
    @XmlAttribute(name = "d1")
    private String cityId;
    @XmlAttribute(name = "d2")
    private String cityName;
    @XmlAttribute(name = "d3")
    private String cityCode;
    @XmlAttribute(name = "d4")
    private String area;
 
}

CityList的bean

import lombok.Data;
 
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
 
@Data
@XmlRootElement(name = "c")
@XmlAccessorType(XmlAccessType.FIELD)
public class CityList {
    @XmlElement(name = "d")
    private List<City> cityList;
}

需要指定bean中的屬性和xml的屬性一一對(duì)應(yīng)

需要有個(gè)工具類XmlBuilder,主要是將XML轉(zhuǎn)為指定的對(duì)象里面只需要一個(gè)方法

import com.thoughtworks.xstream.XStream;
 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.Reader;
import java.io.StringReader;
 
public class XmlBuilder {
 
    /**
     * JAXB將XML轉(zhuǎn)為指定的POJO
     *
     * @param clazz
     * @param xml
     * @return
     */
    public static Object JAXB_XmlToBean(Class<?> clazz, String xml) {
        try {
            Object xmlObject;
            Reader reader;
            JAXBContext context = JAXBContext.newInstance(clazz);
            // XML 轉(zhuǎn)為對(duì)象的接口
            Unmarshaller unmarshaller = context.createUnmarshaller();
            reader = new StringReader(xml);
            //以文件流的方式傳入這個(gè)string
            xmlObject = unmarshaller.unmarshal(reader);
            reader.close();
            return xmlObject;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * XStream將XML轉(zhuǎn)為指定的POJO
     *
     * @param clazz
     * @param xml
     * @return
     */
    public static Object XStream_ToBean(Class<?> clazz, String xml) {
        Object xmlObject;
        XStream xstream = new XStream();
        xstream.processAnnotations(clazz);
        xstream.autodetectAnnotations(true);
        xmlObject = xstream.fromXML(xml);
        return xmlObject;
    }
}

controller

import com.zoo.weixin.test.api.xstream.CityList;
import com.zoo.weixin.test.api.xstream.XmlBuilder;
import lombok.Cleanup;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
 
@RestController
public class XStreamController {
 
    @RequestMapping("JAXB")
    public CityList XStream(HttpServletRequest request, HttpServletResponse response) {
        StringBuilder xml = new StringBuilder();
        try {
            @Cleanup ServletInputStream in = request.getInputStream();
            // 將流轉(zhuǎn)換為字符串
            byte[] b = new byte[4096];
            for (int n; (n = in.read(b)) != -1; ) {
                xml.append(new String(b, 0, n, StandardCharsets.UTF_8));
            }
            // XML轉(zhuǎn)為Java對(duì)象
            CityList cityList = (CityList) XmlBuilder.JAXB_XmlToBean(CityList.class, xml.toString());
            return cityList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

第二種方法是使用XStream

利用XStream在Java對(duì)象和XML之間相互轉(zhuǎn)換

簡(jiǎn)介

Xstream是一種OXMapping 技術(shù),是用來(lái)處理XML文件序列化的框架,在將JavaBean序列化,或?qū)?code>XML文件反序列化的時(shí)候,不需要其它輔助類和映射文件,使得XML序列化不再繁索。Xstream也可以將JavaBean序列化成Json或反序列化,使用非常方便。

主要使用

  • @XStreamAlias(“alis”)java對(duì)象在xml中以標(biāo)簽的形式顯示時(shí),如果名字與類名或者屬性名不一致,可以使用該標(biāo)簽并在括號(hào)內(nèi)注明別名。
  • @XStreamOmitField在輸出XML的時(shí)候忽略該屬性
  • @XStreamImplicit如果該屬性是一個(gè)列表或者數(shù)組,在XML中不顯示list或者Array字樣
  • @XStreamAsAttribute該屬性不單獨(dú)顯示成XML節(jié)點(diǎn),而是作為屬性顯示出來(lái)
  • @XStreamContainedType
  • @XStreamConverter設(shè)置轉(zhuǎn)換器
  • @XStreamConverters converter主要用于將某些字段進(jìn)行復(fù)雜的轉(zhuǎn)換,轉(zhuǎn)換過(guò)程寫(xiě)在一個(gè)類中。

然后將其注冊(cè)到XStream。

首先導(dǎo)入jar包

        <!--xstream-->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.11.1</version>
        </dependency>

最外層bean

package com.guoyao.emergency.vo;
 
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
 
import java.io.Serializable;
 
@Data
@XStreamAlias("InterFaceFile")
public class xmlVo implements Serializable {
    private static final long serialVersionUID = 1L;
    @XStreamAlias("employee")
    Employee employee;
    @XStreamAlias("user")
    User user;
}

兩個(gè)內(nèi)層bean

package com.guoyao.emergency.vo;
 
import com.guoyao.emergency.common.MessageType;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
 
import java.io.Serializable;
 
@Data
@XStreamAlias("employee")
public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    @XStreamAlias("employeeId")
    private int employeeId;
    @XStreamAlias("employeeName")
    private String employeeName;
    @XStreamAlias("department")
    private String department;
 
    public Employee() {
    }
 
    public String getDepartment() {
        return department;
    }
 
    public void setDepartment(String department) {
        this.department = department;
    }
 
    public int getEmployeeId() {
        return employeeId;
    }
 
    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }
 
    public String getEmployeeName() {
        return employeeName;
    }
 
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }
 
 
    public Employee(int employeeId, String employeeName, String department) {
        this.employeeId = employeeId;
        this.employeeName = employeeName;
        this.department = department;
    }
}
package com.guoyao.emergency.vo;
 
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
 
@Data
@XStreamAlias("user")
public class User {
    @XStreamAlias("username")
    private String username;
    @XStreamAlias("password")
    private String password;
    @XStreamAlias("number")
    private int number;
 
    public User(String username, String password, int number) {
        this.username = username;
        this.password = password;
        this.number = number;
    }
 
    public User() {
        this.username = username;
        this.password = password;
    }
 
 
}

工具類及使用方法 

package com.guoyao.emergency.util;
import com.guoyao.emergency.common.IBasicXml;
import com.guoyao.emergency.vo.Employee;
import com.guoyao.emergency.vo.User;
import com.guoyao.emergency.vo.xmlVo;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import org.springframework.beans.factory.annotation.Value;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
/**
 * @Description: 將Java對(duì)象序列化成XML格式,將XML反序列化還原為Java對(duì)象
 */
public class xmlUtil extends XStream {
    /**
     * 將Java對(duì)象序列化成XML格式
     *
     * @param vo
     * @return
     * @throws IOException
     */
    public static String serialize(xmlVo vo) {
        // 將employee對(duì)象序列化為XML
        XStream xStream = new XStream(new DomDriver());
        // 設(shè)置employee類的別名
        xStream.alias("InterFaceFile", xmlVo.class);
        String personXml = xStream.toXML(vo);
        return personXml;
    }
    /**
     * 將XML反序列化還原為Java對(duì)象
     *
     * @param personXml
     * @return
     */
    public xmlVo deserialize(String personXml) {
        // 將employee對(duì)象序列化為XML
        XStream xstream = new XStream(new DomDriver());
        XStream.setupDefaultSecurity(this); // to be removed after 1.5
        xstream.allowTypesByWildcard(new String[]{
                "com.xttblog.package.**"
        });
        xmlVo employee = (xmlVo) xstream.fromXML(personXml);
        return employee;
    }
    /**
     * 將XML反序列化還原為Java對(duì)象
     * java對(duì)象類型可配置
     *
     * @param xmlStr
     * @return
     */
    public static <T> T xmlToBean(String xmlStr, Class<T> cls) {
        XStream xstream = new XStream();
        //不使用默認(rèn)的類加載器,需要手動(dòng)設(shè)置類加載器
        xstream.setClassLoader(cls.getClassLoader());
        xstream.processAnnotations(cls);
        xstream.allowTypesByRegExp(new String[]{".*"});
        Object obj = xstream.fromXML(xmlStr);
        return (T) obj;
    }
    /**
     * 生成Xml文件,可以寫(xiě)入指定路徑
     *
     * @param xmlSource
     * @throws SAXException
     * @throws ParserConfigurationException
     * @throws IOException
     * @throws TransformerException
     */
    public static void stringToDom(String xmlSource)
            throws SAXException, ParserConfigurationException, IOException, TransformerException {
        // Parse the given input
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new InputSource(new StringReader(xmlSource)));
        // Write the parsed document to an xml file
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        System.out.println(source);
        StreamResult result = new StreamResult(new File("my-file.xml"));
        transformer.transform(source, result);
    }
    public static void main(String[] args) throws IOException, ParserConfigurationException, TransformerException, SAXException {
        xmlVo vo = new xmlVo();
        Employee employee = new Employee();
        employee.setEmployeeId(1);
        employee.setEmployeeName("趙新國(guó)1111");
        employee.setDepartment("軟件工程師");
        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("10");
        vo.setEmployee(employee);
        vo.setUser(user);
        // 序列化
        String serialize = serialize(vo);
        System.out.println(serialize);
//        stringToDom(serialize);
        // 反序列化
        xmlVo xmlVo = xmlToBean(serialize, xmlVo.class);
        System.out.println(xmlVo.toString());
        User user1 = xmlVo.getUser();
        System.out.println(user1.getUsername());
//        xmlUtil util = new xmlUtil();
//        xmlVo deserialize = util.deserialize(serialize);
//        System.out.println(deserialize.toString());
//        User user1 = deserialize.getUser();
//        System.out.println(user1.getUsername());
    }
}
 

重命名注解:@XStreamAlias()

這些命名都需要和解析的xml的屬性名一一對(duì)應(yīng),一旦不對(duì)應(yīng)就會(huì)報(bào)com.thoughtworks.xstream.mapper.CannotResolveClassException異常,找不到對(duì)應(yīng)的類屬性
集合屬性的需要使用:@XStreamImplicit,不然會(huì)報(bào)com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException轉(zhuǎn)換器映射異常

省略集合根節(jié)點(diǎn):@XStreamImplicit

把字段節(jié)點(diǎn)設(shè)置成屬性:@XStreamAsAttribute

拓展了解

XStream提供了很多方法供我們使用

  • autodetectAnnotations()自動(dòng)檢測(cè)注解
  • processAnnotations()應(yīng)用傳過(guò)來(lái)的類的注解
  • fromXML()XML反序列化(JSON也是一樣)
  • toXML()XML序列化(JSON也是一樣)

自定義解析器

Xstream序列化XML,解析器用StaxDriver

指定解析器:XStream xstream = new XStream(new StaxDriver());

Xstream序列化Json,解析器用JettisonMappedXmlDriver

指定解析器:XStream xstream = new XStream(new JettisonMappedXmlDriver());

也可以不具體指定解析器,也是沒(méi)問(wèn)題的

深入了解

XStreamxstream = new XStream();

默認(rèn)情況下,XStream會(huì) 采用Xpp3庫(kù),XPP3是一種運(yùn)行效率非常高的XML全解析實(shí)現(xiàn)。如果你不想依靠Xpp3庫(kù)的話,也可以使用一個(gè)標(biāo)準(zhǔn)的JAXP DOM解析器,可以采用以下語(yǔ)句進(jìn)行初始化:

//不使用XPP3庫(kù)

XStreamxstream = new XStream(new DomDriver());

此xstream實(shí)例,為線程安全的,可以供多個(gè)線程進(jìn)行調(diào)用,共享使用。系統(tǒng)提供了多種標(biāo)識(shí)解析器供我們選擇,包括,DomDriver、 JDomDriver、StaxDriver等等。

Xstream提供了對(duì)Json的支持,是因?yàn)閄stream內(nèi)置了兩個(gè)Driver:

1.JsonHierarchicalStreamDriver:不依賴其他類庫(kù),只實(shí)現(xiàn) obj->JSON

2.JettisonMappedXmlDriver:依賴jettison類庫(kù),實(shí)現(xiàn) JSON->obj or obj->JSON

兩種Driver在處理相同設(shè)置的Object時(shí)會(huì)得到不同的JSON串,JsonHierarchicalStreamDriver得到的串更簡(jiǎn)潔,確如官網(wǎng)所說(shuō)。
JsonHierarchicalStreamDriver有個(gè)小問(wèn)題——默認(rèn)輸出帶格式的JSON串,結(jié)構(gòu)中帶空舉

總結(jié)

到此這篇關(guān)于java中xml和對(duì)象之間的互相轉(zhuǎn)換方法的文章就介紹到這了,更多相關(guān)java xml和對(duì)象互相轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解java如何正確使用volatile

    詳解java如何正確使用volatile

    這篇文章給大家分享了java如何正確使用volatile的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。
    2018-07-07
  • Java IO流 文件的編碼實(shí)例代碼

    Java IO流 文件的編碼實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家介紹了java io流文件編碼的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-05-05
  • nacos一直頻繁的打印日志get changegroupkeys問(wèn)題

    nacos一直頻繁的打印日志get changegroupkeys問(wèn)題

    這篇文章主要介紹了nacos一直頻繁的打印日志get changegroupkeys問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java實(shí)現(xiàn)登錄密碼強(qiáng)度校驗(yàn)的項(xiàng)目實(shí)踐

    Java實(shí)現(xiàn)登錄密碼強(qiáng)度校驗(yàn)的項(xiàng)目實(shí)踐

    本文主要介紹了Java實(shí)現(xiàn)登錄密碼強(qiáng)度校驗(yàn)的項(xiàng)目實(shí)踐,包括使用正則表達(dá)式匹配校驗(yàn)和密碼強(qiáng)度校驗(yàn)工具類這兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java在PowerPoint幻燈片中創(chuàng)建散點(diǎn)圖的方法

    Java在PowerPoint幻燈片中創(chuàng)建散點(diǎn)圖的方法

    散點(diǎn)圖是通過(guò)兩組數(shù)據(jù)構(gòu)成多個(gè)坐標(biāo)點(diǎn),考察坐標(biāo)點(diǎn)的分布,判斷兩變量之間是否存在某種關(guān)聯(lián)或總結(jié)坐標(biāo)點(diǎn)的分布模式,這篇文章主要介紹了Java如何在PowerPoint幻燈片中創(chuàng)建散點(diǎn)圖,需要的朋友可以參考下
    2023-04-04
  • IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法

    IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法

    這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 淺談Java操作符與其優(yōu)先級(jí)

    淺談Java操作符與其優(yōu)先級(jí)

    這篇文章主要介紹了淺談Java操作符與其優(yōu)先級(jí),具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • MyBatis學(xué)習(xí)教程(四)-如何快速解決字段名與實(shí)體類屬性名不相同的沖突問(wèn)題

    MyBatis學(xué)習(xí)教程(四)-如何快速解決字段名與實(shí)體類屬性名不相同的沖突問(wèn)題

    我們經(jīng)常會(huì)遇到表中的字段名和表對(duì)應(yīng)實(shí)體類的屬性名稱不一定都是完全相同的情況,如何解決呢?下面腳本之家小編給大家介紹MyBatis學(xué)習(xí)教程(四)-如何快速解決字段名與實(shí)體類屬性名不相同的沖突問(wèn)題,一起學(xué)習(xí)吧
    2016-05-05
  • Java操作mongodb增刪改查的基本操作實(shí)戰(zhàn)指南

    Java操作mongodb增刪改查的基本操作實(shí)戰(zhàn)指南

    MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),由c++語(yǔ)言編寫(xiě),旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,下面這篇文章主要給大家介紹了關(guān)于Java操作mongodb增刪改查的基本操作實(shí)戰(zhàn)指南,需要的朋友可以參考下
    2023-05-05
  • (starters)springboot-starter整合阿里云datahub方式

    (starters)springboot-starter整合阿里云datahub方式

    這篇文章主要介紹了(starters)springboot-starter整合阿里云datahub方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論

静乐县| 东港市| 襄垣县| 武功县| 卢龙县| 奉节县| 通化市| 通辽市| 金平| 武宁县| 嘉定区| 漠河县| 浑源县| 阳高县| 涟源市| 正蓝旗| 郁南县| 方正县| 马边| 江达县| 乐安县| 镇坪县| 开封市| 米脂县| 陵水| 望江县| 班玛县| 资源县| 于都县| 新邵县| 高碑店市| 安泽县| 定边县| 綦江县| 延边| 嘉峪关市| 垫江县| 宁海县| 瑞昌市| 旅游| 巫溪县|