java 对象转xml_Java bean与xml 互转(对象转xml、xml转对象)-程序员宅基地

技术标签: java 对象转xml  

importorg.jdom2.Document;importorg.jdom2.Element;importorg.jdom2.input.SAXBuilder;importorg.jdom2.output.Format;importorg.jdom2.output.XMLOutputter;import java.io.*;importjava.lang.reflect.Field;importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;/*** CREATE BY OUKELE

* CREATE TIME:2020/3/17 - 9:15*/

/***

* 1、实现 对象 转 xml

* 2、实现 xml 转对象*/

public classXmlInterfaceUtils {privateXmlInterfaceUtils() {

}/*** 对象 转 xml

*

*@paramobject

*@return返回一个生成xml的位置*/

public staticString convertToXml(Object object) {if (object == null) {return null;

}

Element root= null;try{

Class> aClass =object.getClass();//根节点

root = newElement(aClass.getSimpleName());for(Field declaredField : aClass.getDeclaredFields()) {

declaredField.setAccessible(true);//这个属性为 List 时

if (declaredField.getGenericType() instanceofParameterizedType) {

Element child1= newElement(declaredField.getName());

List> objList = (List>) declaredField.get(object);if (objList != null) {

ListObjecToXml(objList, child1);

root.addContent(child1);

}

}else{

String fieldName=declaredField.getName();

Element child= newElement(fieldName);

child.setText(String.valueOf(declaredField.get(object)));

root.addContent(child);

}

}

}catch(Exception e) {

e.printStackTrace();

System.out.println("对象转换成XML出现异常:" +e.getMessage());

}try{//将 根节点 加入 文档中

Document doc = newDocument(root);//创建xml输出流操作类

XMLOutputter xmlOutput = newXMLOutputter();//格式化xml内容

xmlOutput.setFormat(Format.getPrettyFormat());

File directory= new File("src/main/resources");

String courseFile=directory.getCanonicalPath();//把xml输出到指定位置

File f = new File(courseFile + File.separator + "temp");if (!f.exists()) {

f.mkdirs();

}

SimpleDateFormat format= new SimpleDateFormat("yyyyMMddHHssmm");

System.out.println(f.getAbsolutePath());

File file= new File(f.getAbsolutePath() + File.separator + object.getClass().getSimpleName() + format.format(new Date()) + ".xml");

xmlOutput.output(doc,newFileOutputStream(file));

System.out.println("生成完毕! " + file.getName() + "文件生成位置为:" +file.getAbsolutePath());returnfile.getAbsolutePath();

}catch(Exception e) {

e.printStackTrace();

System.out.println("生成xml文件出现异常:" +e.getMessage());

}return null;

}//处理 List objData

private static void ListObjecToXml(List> objData, Element element) throwsException {if (objData != null) {for (int i = 0; i < objData.size(); i++) {

Field[] declaredFields=objData.get(i).getClass().getDeclaredFields();

Object obj=objData.get(i);

Element root= newElement(obj.getClass().getSimpleName());for(Field declaredField : declaredFields) {

declaredField.setAccessible(true);

Element child= newElement(declaredField.getName());if (declaredField.getGenericType() instanceofParameterizedType) {

List> objList = (List>) declaredField.get(obj);if (objList != null) {

ListObjecToXml(objList, child);

root.addContent(child);

}

}else{

child.setText(String.valueOf(declaredField.get(obj)));

root.addContent(child);

}

}

element.addContent(root);

}

}

}/*** xml 转 对象

*

*@paramclazz

*@paramxmlStr

*@return*@throwsException*/

public static Object dataXmltoEntity(Class>clazz, String xmlStr) {if (clazz == null) {

System.out.println("未设置对象的类型");return null;

}

File file= newFile(xmlStr);if (!file.exists()) {

System.out.println("解析失败,找不到文件");return null;

}//创建Jdom2的解析器对象

SAXBuilder builder = newSAXBuilder();

Document document= null;

Element root= null;

Object obj= null;try{

document=builder.build(file.getAbsoluteFile());

root=document.getRootElement();if (!root.getName().equals(clazz.getSimpleName())) {

System.out.println("xml内容无法转成 " + clazz + "对象,请检查!");return null;

}//new出 当前最大的对象

obj =clazz.getConstructor().newInstance();

}catch(Exception e) {

e.printStackTrace();

System.out.println("无法进行xml解析,请检查!");

}try{

List children =root.getChildren();for(Element child : children) {//第二层的xml数据

List children1 =child.getChildren();if (children1.isEmpty()) { //处理第一层的xml数据

Field field =clazz.getDeclaredField(child.getName());

field.setAccessible(true);if (field.getGenericType().getTypeName().equals("int")) {

field.set(obj, Integer.parseInt(child.getValue()));

}else{

field.set(obj, child.getValue());

}

}else { //处理第二层的 xml 数据

mm(clazz, obj, child, children1);

}

}

}catch(Exception e) {

e.printStackTrace();

System.out.println("解析xml数据转换成实体出现异常:" +e.getMessage());

}returnobj;

}private static void mm(Class> clazz, Object obj, Element child, List children1) throwsException {//取到当前的 list 属性

Field field =clazz.getDeclaredField(child.getName());

field.setAccessible(true);

Class> genericClazz = null;if (field.getType() == List.class) {//如果是List类型,得到其Generic的类型

Type genericType =field.getGenericType();if (genericType != null) {//如果是泛型参数的类型

if (genericType instanceofParameterizedType) {

ParameterizedType pt=(ParameterizedType) genericType;//得到泛型里的class类型对象

genericClazz = (Class>) pt.getActualTypeArguments()[0];

}

}

}if (genericClazz != null) {

List list= newArrayList();//list 中 包含的对象

for(Element element : children1) {//取出当前类的属性与值

List children2 =element.getChildren();//new 出List中包含的对象

Object o =genericClazz.getConstructor().newInstance();//当前对象进行赋值

for(Element element1 : children2) {if(element1.getChildren().isEmpty()) {

Field field1=genericClazz.getDeclaredField(element1.getName());

field1.setAccessible(true);

field1.set(o, element1.getValue());

}else{//递归处理

mm(genericClazz, o, element1, element1.getChildren());

}

}

list.add(o);

}

field.set(obj, list);

}

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39834205/article/details/114037576

智能推荐

未来计算机发展应向着,计算机的发展、特点、分类及应用领域。-程序员宅基地

文章浏览阅读2.1k次。计算机的发展趋势,未来计算机性能应向着微型化、网络化、智能化和巨型化的方向发展。主要特点1.运算速度快:计算机内部电路组成,可以高速准确地完成各种算术运算。2.计算精确度高:科学技术的发展特别是尖端科学技术的发展,需要高度精确的计算。3.存储容量大:计算机内部的存储器具有记忆特性,可以存储大量的信息。4.自动化程度高:计算机具有存储记忆能力和逻辑判断能力,所以人们可以预先编好程序组然后纳入计算机内..._未来计算机都有哪些种类?有什么特点?

完美解决ASP.NET无法上传大文件方法-程序员宅基地

文章浏览阅读802次,点赞10次,收藏16次。需要提供前端源码,后端源码,控件源码,公司自己的项目,也有自己的产品,后续需要集成使用,提供7*24小时技术支持服务,提供文档教程,视频教程,远程技术指导,1对1技术支持服务,提供手机,微信,QQ,邮箱,企业微信等联系方式。要求支持断点续传,支持进度信息离线存储,用户可能传一半没有传完,下班了,明天上班后继续上传,电脑晚上到点需要关机,支持加密传输,支持国密加密算法SM4,要求能够在网页上面上传文件夹,文件夹里面大约有1万多个文件,有大有小,大的有1G~10G,小的有几MB,使用IIS Express。

可能是目前最全的《Android面试题大全》(中高级)(4),2024年最新android界面布局实验报告-程序员宅基地

文章浏览阅读657次,点赞12次,收藏19次。那我们该怎么做才能做到年薪60万+呢,对于程序员来说,只有不断学习,不断提升自己的实力。我之前有篇文章提到过,感兴趣的可以看看,到底要学习哪些知识才能达到年薪60万+。通过职友集数据可以查看,以北京 Android 相关岗位为例,其中 【20k-30k】 薪酬的 Android 工程师,占到了整体从业者的 30.8%!北京 Android 工程师「工资收入水平 」今天重点内容是怎么去学,怎么提高自己的技术。1.合理安排时间2.找对好的系统的学习资料3.有老师带,可以随时解决问题。

安装群晖系统入门图文教程-程序员宅基地

文章浏览阅读7.3k次。本教程基于Proxmox VE(PVE)7.1虚拟机环境下安装群晖,兼容这块简单说明:Intel酷睿四代以下或者志强处理器建议安装Ds3615-3617-3266等版本,四代以上可以安装918-920等版本,如果你``啥都不知道,安装Ds3615就对了。1.先删除删除local-lvm分区, 具体教程https://blog.csdn.net/u012514495/article/details/127318440。10.网络这里,因为引导包含虚拟机的驱动,所以不需要在进行额外设置,默认即可,继续下一步。_群晖系统

FreeMarker 自定义 TemplateDirectiveModel(一)-程序员宅基地

文章浏览阅读259次。FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。一、Freemarker 的介绍​ Freemarker 是一款模板引擎,是一种基于模版生成静态文件的..._freemarker templatedirectivemodel 例子

微信小程序request请求封装,session封装,会话超时处理_微信小程序 请求封装 超时-程序员宅基地

文章浏览阅读544次。微信小程序request请求封装,session封装,会话超时处理直接上代码,代码中写了很详细的注释// 同时发送异步代码的次数let ajaxTimes = 0;export const request = (params, method) => { let header = { ...params.header, "Cookie": getApp().globalData.cookieStr, 'loc':'ajax' };//头部,小程序的头部是默认的 _微信小程序 请求封装 超时

随便推点

MyBatis-Plus入门三:逻辑删除与查询中排除删除标识字段_mybatisplus 不查询删除标识-程序员宅基地

文章浏览阅读1w次。一、逻辑删除实现当有些数据删除后,不需要将其在数据库中删掉,而仅仅是添加一个字段deleted来作为删除标识;1.在application.yml文件中添加mybatis-plus:`global-config: db-config: logic-not-delete-value: 0 //代表逻辑未删除 logic-delete-value: 1` //标..._mybatisplus 不查询删除标识

【配送路径规划】模拟退火算法单配送中心多客户多车辆配送路径规划【含Matlab源码 1604期】_配送路径优化 模拟退火-程序员宅基地

文章浏览阅读576次。模拟退火算法单配送中心多客户多车辆配送路径规划完整的代码,方可运行;可提供运行操作视频!适合小白!_配送路径优化 模拟退火

发作性睡病是否会遗传?-程序员宅基地

文章浏览阅读13次。研究还发现,发作性睡病患者的家族中,常常存在多个成员患有相同的疾病,这进一步表明了遗传因素在发作性睡病的发病中的重要性。因此,对于具有发作性睡病遗传倾向的人群,应该注意保持健康的生活方式和良好的心理状态,以降低患上发作性睡病的风险。但是,需要指出的是,虽然遗传因素在发作性睡病的发病中起到了重要的作用,但并不是所有具有遗传易感性的人都会患上发作性睡病。因此,即使具有发作性睡病的遗传倾向,通过保持健康的生活方式和良好的心理状态,也可以降低患上发作性睡病的风险。

node.js调用C++的一种方案_js调用c++库-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏10次。nodejs官方维护了一套ABI(应用二进制接口),用于完成nodejs和C++的通信。官网介绍的是C API,对应的是它的C++版本,更容易使用,本文介绍的也是这个C++的版本。通过一个示例来说明如何使用node-addon-api。_js调用c++库

EMQX 5.0 全新网关框架:轻松实现多物联网协议接入_emqx连接对调物联网设备-程序员宅基地

文章浏览阅读1.4k次。本文将对EMQX全新的网关框架及功能使用进行详细解读,帮助读者更好地利用EMQX的多协议接入能力连接各类设备,满足更多物联网场景的数据接入需求。_emqx连接对调物联网设备

python并发与网络编程_python中for循环联网请求参数-程序员宅基地

文章浏览阅读475次。python并发与网络编程Linux 操作系统及其组成1.操作系统的作用​ 操作系统 : 与硬件交互​ 应用程序 --> 请求调用操作系统功能 --> 硬件调用(cpu,内存)​ 操作系统(OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。2.Linux 操作系统组成一个典型的 Linu_python中for循环联网请求参数

推荐文章

热门文章

相关标签