技术标签: 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);
}
}
}
文章浏览阅读2.1k次。计算机的发展趋势,未来计算机性能应向着微型化、网络化、智能化和巨型化的方向发展。主要特点1.运算速度快:计算机内部电路组成,可以高速准确地完成各种算术运算。2.计算精确度高:科学技术的发展特别是尖端科学技术的发展,需要高度精确的计算。3.存储容量大:计算机内部的存储器具有记忆特性,可以存储大量的信息。4.自动化程度高:计算机具有存储记忆能力和逻辑判断能力,所以人们可以预先编好程序组然后纳入计算机内..._未来计算机都有哪些种类?有什么特点?
文章浏览阅读802次,点赞10次,收藏16次。需要提供前端源码,后端源码,控件源码,公司自己的项目,也有自己的产品,后续需要集成使用,提供7*24小时技术支持服务,提供文档教程,视频教程,远程技术指导,1对1技术支持服务,提供手机,微信,QQ,邮箱,企业微信等联系方式。要求支持断点续传,支持进度信息离线存储,用户可能传一半没有传完,下班了,明天上班后继续上传,电脑晚上到点需要关机,支持加密传输,支持国密加密算法SM4,要求能够在网页上面上传文件夹,文件夹里面大约有1万多个文件,有大有小,大的有1G~10G,小的有几MB,使用IIS Express。
文章浏览阅读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.网络这里,因为引导包含虚拟机的驱动,所以不需要在进行额外设置,默认即可,继续下一步。_群晖系统
文章浏览阅读259次。FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。一、Freemarker 的介绍 Freemarker 是一款模板引擎,是一种基于模版生成静态文件的..._freemarker templatedirectivemodel 例子
文章浏览阅读544次。微信小程序request请求封装,session封装,会话超时处理直接上代码,代码中写了很详细的注释// 同时发送异步代码的次数let ajaxTimes = 0;export const request = (params, method) => { let header = { ...params.header, "Cookie": getApp().globalData.cookieStr, 'loc':'ajax' };//头部,小程序的头部是默认的 _微信小程序 请求封装 超时
文章浏览阅读1w次。一、逻辑删除实现当有些数据删除后,不需要将其在数据库中删掉,而仅仅是添加一个字段deleted来作为删除标识;1.在application.yml文件中添加mybatis-plus:`global-config: db-config: logic-not-delete-value: 0 //代表逻辑未删除 logic-delete-value: 1` //标..._mybatisplus 不查询删除标识
文章浏览阅读576次。模拟退火算法单配送中心多客户多车辆配送路径规划完整的代码,方可运行;可提供运行操作视频!适合小白!_配送路径优化 模拟退火
文章浏览阅读13次。研究还发现,发作性睡病患者的家族中,常常存在多个成员患有相同的疾病,这进一步表明了遗传因素在发作性睡病的发病中的重要性。因此,对于具有发作性睡病遗传倾向的人群,应该注意保持健康的生活方式和良好的心理状态,以降低患上发作性睡病的风险。但是,需要指出的是,虽然遗传因素在发作性睡病的发病中起到了重要的作用,但并不是所有具有遗传易感性的人都会患上发作性睡病。因此,即使具有发作性睡病的遗传倾向,通过保持健康的生活方式和良好的心理状态,也可以降低患上发作性睡病的风险。
文章浏览阅读3.6k次,点赞3次,收藏10次。nodejs官方维护了一套ABI(应用二进制接口),用于完成nodejs和C++的通信。官网介绍的是C API,对应的是它的C++版本,更容易使用,本文介绍的也是这个C++的版本。通过一个示例来说明如何使用node-addon-api。_js调用c++库
文章浏览阅读1.4k次。本文将对EMQX全新的网关框架及功能使用进行详细解读,帮助读者更好地利用EMQX的多协议接入能力连接各类设备,满足更多物联网场景的数据接入需求。_emqx连接对调物联网设备
文章浏览阅读475次。python并发与网络编程Linux 操作系统及其组成1.操作系统的作用 操作系统 : 与硬件交互 应用程序 --> 请求调用操作系统功能 --> 硬件调用(cpu,内存) 操作系统(OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。2.Linux 操作系统组成一个典型的 Linu_python中for循环联网请求参数