我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java--- xml和对象之间的互相转换

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java--- xml和对象之间的互相转换


例子是把xml映射成bean成对象

            

第一种方法是使用 JAXB(Java Architecture for XML Binding) 实现XML与Bean的相互转换

简介

JAXB是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。Jaxb2使用了JDK的新特性,如:AnnotationGenericType等,需要在即将转换的JavaBean中添加annotation注解。

重要的使用有:

JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。其他值还有XmlAccessType.PROPERTYXmlAccessType.NONE
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个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")//访问类型,通过字段@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 cityList;}

需要指定bean中的属性和xml的属性一一对应

需要有个工具类XmlBuilder,主要是将XML转为指定的对象里面只需要一个方法

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 {        public static Object JAXB_XmlToBean(Class clazz, String xml) {        try {            Object xmlObject;            Reader reader;            JAXBContext context = JAXBContext.newInstance(clazz);            // XML 转为对象的接口            Unmarshaller unmarshaller = context.createUnmarshaller();            reader = new StringReader(xml);            //以文件流的方式传入这个string            xmlObject = unmarshaller.unmarshal(reader);            reader.close();            return xmlObject;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }        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;@RestControllerpublic class XStreamController {    @RequestMapping("JAXB")    public CityList XStream(HttpServletRequest request, HttpServletResponse response) {        StringBuilder xml = new StringBuilder();        try {            @Cleanup ServletInputStream in = request.getInputStream();            // 将流转换为字符串            byte[] b = new byte[4096];            for (int n; (n = in.read(b)) != -1; ) {                xml.append(new String(b, 0, n, StandardCharsets.UTF_8));            }            // XML转为Java对象            CityList cityList = (CityList) XmlBuilder.JAXB_XmlToBean(CityList.class, xml.toString());            return cityList;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }}

第二种方法是使用XStream

利用XStream在Java对象和XML之间相互转换
简介
Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列化,使用非常方便。
主要使用
@XStreamAlias(“alis”)java对象在xml中以标签的形式显示时,如果名字与类名或者属性名不一致,可以使用该标签并在括号内注明别名。
@XStreamOmitField在输出XML的时候忽略该属性
@XStreamImplicit如果该属性是一个列表或者数组,在XML中不显示list或者Array字样
@XStreamAsAttribute该属性不单独显示成XML节点,而是作为属性显示出来
@XStreamContainedType
@XStreamConverter设置转换器
@XStreamConverters converter主要用于将某些字段进行复杂的转换,转换过程写在一个类中。
然后将其注册到XStream。

首先导入jar包

                            com.thoughtworks.xstream            xstream            1.4.11.1        

最外层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;}

两个内层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;public class xmlUtil extends XStream {        public static String serialize(xmlVo vo) {        // 将employee对象序列化为XML        XStream xStream = new XStream(new DomDriver());        // 设置employee类的别名        xStream.alias("InterFaceFile", xmlVo.class);        String personXml = xStream.toXML(vo);        return personXml;    }        public xmlVo deserialize(String personXml) {        // 将employee对象序列化为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;    }        public static  T xmlToBean(String xmlStr, Class cls) {        XStream xstream = new XStream();        //不使用默认的类加载器,需要手动设置类加载器        xstream.setClassLoader(cls.getClassLoader());        xstream.processAnnotations(cls);        xstream.allowTypesByRegExp(new String[]{".*"});        Object obj = xstream.fromXML(xmlStr);        return (T) obj;    }        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("赵新国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的属性名一一对应,一旦不对应就会报com.thoughtworks.xstream.mapper.CannotResolveClassException异常,找不到对应的类属性
    集合属性的需要使用:@XStreamImplicit,不然会报com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException转换器映射异常

省略集合根节点:@XStreamImplicit
把字段节点设置成属性:@XStreamAsAttribute

拓展了解

XStream提供了很多方法供我们使用
autodetectAnnotations()自动检测注解
processAnnotations()应用传过来的类的注解
fromXML()XML反序列化(JSON也是一样)
toXML()XML序列化(JSON也是一样)

自定义解析器
Xstream序列化XML,解析器用StaxDriver
指定解析器:XStream xstream = new XStream(new StaxDriver());
Xstream序列化Json,解析器用JettisonMappedXmlDriver
指定解析器:XStream xstream = new XStream(new JettisonMappedXmlDriver());
也可以不具体指定解析器,也是没问题的

深入了解

XStreamxstream = new XStream();
默认情况下,XStream会 采用Xpp3库,XPP3是一种运行效率非常高的XML全解析实现。如果你不想依靠Xpp3库的话,也可以使用一个标准的JAXP DOM解析器,可以采用以下语句进行初始化:
//不使用XPP3
XStreamxstream = new XStream(new DomDriver());

此xstream实例,为线程安全的,可以供多个线程进行调用,共享使用。系统提供了多种标识解析器供我们选择,包括,DomDriver、 JDomDriverStaxDriver等等。

Xstream提供了对Json的支持,是因为Xstream内置了两个Driver:
1.JsonHierarchicalStreamDriver:不依赖其他类库,只实现 obj->JSON
2.JettisonMappedXmlDriver:依赖jettison类库,实现 JSON->obj or obj->JSON
两种Driver在处理相同设置的Object时会得到不同的JSON串,JsonHierarchicalStreamDriver得到的串更简洁,确如官网所说。
JsonHierarchicalStreamDriver有个小问题——默认输出带格式的JSON串,结构中带空举

来源地址:https://blog.csdn.net/m0_56076357/article/details/129558802

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java--- xml和对象之间的互相转换

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java对象与json对象之间互相转换实现方法示例

本文实例讲述了java对象与json对象之间互相转换实现方法。分享给大家供大家参考,具体如下:import java.util.ArrayList;import java.util.Collection;import java.util.I
2023-05-30

java对象怎么与JSON互相转换

这篇文章将为大家详细讲解有关java对象怎么与JSON互相转换,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体方法如下:import java.beans.IntrospectionExc
2023-05-31

Java中JavaBean对象和Map的互相转换方法实例

为什么需要将javaBean和map进行转换,在很多应用场景中,需要将key=value形式的数据与javaBean对象相互转换,下面这篇文章主要给大家介绍了关于Java中JavaBean对象和Map的互相转换的相关资料,需要的朋友可以参考下
2022-11-16

python3中bytes和string之间的互相转换

前言 Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分
2022-06-04

如何使用JAXBContext实现Java和xml的互相转换

这篇文章主要介绍了如何使用JAXBContext实现Java和xml的互相转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JAXBContext实现Java和xml的互相转
2023-06-20

json对象和formData相互转换的方式详解

我们有两种常见的传参方式:JSON对象格式和formData格式,但是一些场景是需要我们对这两种数据格式进行转换的,这篇文章主要介绍了json对象和formData相互转换的方式详解,需要的朋友可以参考下
2023-02-14

Java实现的时间戳与date对象相互转换功能示例

本文实例讲述了Java实现的时间戳与date对象相互转换功能。分享给大家供大家参考,具体如下:一.日期转换为时间戳public long getTimestamp() throws ParseException{ Date date1 =
2023-05-31

java 中InputStream,String,File之间的相互转化对比

InputStream,String,File相互转化 1. String --> InputStreamInputStream String2InputStream(String str){ ByteArrayInputStream st
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录