XStream导出xml文件
最终效果
pom依赖
<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.11.1</version></dependency>
代码
XStreamUtil
这个直接复制即可
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;
import com.thoughtworks.xstream.io.xml.XppDriver;import java.io.Writer;
import java.lang.reflect.Field;public class XStreamUtil {public static XStream getXStream(Class<?> targetClass,Class<?> targetClass2) {XStream stream = new XStream(new XppDriver() {@Overridepublic HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out) {// 对所有xml节点的转换都增加CDATA标记boolean cdata = false;@Override@SuppressWarnings("rawtypes")public void startNode(String name, Class clazz) {super.startNode(name, clazz);cdata = needCDATA(targetClass, name);if(!cdata && targetClass2 != null ){cdata = needCDATA(targetClass2, name);}}@Overrideprotected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});return stream;}private static boolean needCDATA(Class<?> targetClass, String fieldAlias){boolean cdata = false;//first, scan selfcdata = existsCDATA(targetClass, fieldAlias);if(cdata){return cdata;}//if cdata is false, scan supperClass until java.lang.ObjectClass<?> superClass = targetClass.getSuperclass();while(!superClass.equals(Object.class)){cdata = existsCDATA(superClass, fieldAlias);if(cdata) {return cdata;}superClass = superClass.getSuperclass();}return false;}private static boolean existsCDATA(Class<?> clazz, String fieldAlias){//scan fieldsField[] fields = clazz.getDeclaredFields();for (Field field : fields) {//1. exists XStreamCDATAif(field.getAnnotation(XStreamCDATA.class) != null ){XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class);//2. exists XStreamAliasif(null != xStreamAlias){if(fieldAlias.equals(xStreamAlias.value())){//matchedreturn true;}}else{// not exists XStreamAliasif(fieldAlias.equals(field.getName())){return true;}}}}return false;}public static XStream getXStream(Class<?> targetClass, Class<?>... subClasses) {XStream stream = new XStream(new XppDriver() {@Overridepublic HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out, new XmlFriendlyReplacer("_-", "_")) {// 对所有xml节点的转换都增加CDATA标记boolean cdata = false;@Override@SuppressWarnings("rawtypes")public void startNode(String name, Class clazz) {super.startNode(name, clazz);cdata = needCDATA(targetClass, name);if (subClasses != null && !cdata) {for (Class<?> subClass : subClasses) {if (subClass != null) {cdata = needCDATA(subClass, name);}}}}@Overrideprotected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});return stream;}
}
ResponseSetUtils
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ResponseSetUtils {public static void set(HttpServletResponse response, HttpServletRequest request) {response.addHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));response.addHeader("Access-Control-Allow-Headers", "Accept,Authorization,DNT,Content-Type,Referer,User-Agent");response.addHeader("Access-Control-Allow-Credentials", "true");}/*** 设置下载头*/public static void setResponseHeader(HttpServletResponse response, String fileName) {response.setContentType("application/octet-stream");response.addHeader("Content-Disposition", "attachment;filename=" + fileName);response.addHeader("Cache-control", "no-cache");}
}
controller
/*** 导出到xml** @param response* @param request* @param param* @return*/@PostMapping(value = "export-2-xml")public ResultModel<JSONObject> export2Xml(HttpServletResponse response, HttpServletRequest request,@RequestBody AdvertiseItemExportParam param) throws IOException {ResultModel<JSONObject> rst = new ResultModel<>();JSONObject track = new JSONObject().fluentPut("param", param);rst.setModule(track);try {// 登录校验;StringBuilder checkLoginMsg = new StringBuilder();BucSSOUser user = checkLoginUser(response, request, checkLoginMsg);if (StringUtils.isNotBlank(checkLoginMsg.toString())) {return ResultModel.failed(checkLoginMsg.toString());}// 用户信息;boolean agent = RealmIdEnum.AGENT_TENANT.getTenantId().equals(user.getRealmId());String no = agent ? user.getCorpUserId() : user.getEmpId();LoginUserRoleEnum loginUserRole = agent ? LoginUserRoleEnum.AGENT : LoginUserRoleEnum.INNER_USER;LoginUserModel userModel = new LoginUserModel(no, user.getNickNameCn(), agent, loginUserRole.name());// 分页查询数据;List allData = advertiseCommonController.getAllRows(param, userModel);// 转xml;XStream xStream;if (agent) {// 代理xStream = XStreamUtil.getXStream(OfferExportAgency.class);xStream.processAnnotations(OfferExportAgency.class);} else {// 非代理:运营、管理xStream = XStreamUtil.getXStream(OfferExportOperator.class);xStream.processAnnotations(OfferExportOperator.class);}xStream.alias("offerList", List.class);// 写输出流;String fileName = UUID.randomUUID().toString().replace("-", "") + ".xml";ResponseSetUtils.set(response, request);ResponseSetUtils.setResponseHeader(response, fileName);ServletOutputStream outputStream = response.getOutputStream();outputStream.write(XML_VERSION_1_0_ENCODING_UTF_8.getBytes(StandardCharsets.UTF_8));xStream.toXML(allData, outputStream);outputStream.flush();outputStream.close();// 返回结果;rst.setSuccess(true);return rst;} catch (IOException e) {LOGGER.error("AdvertiseItemController.export2Xml process error,param:{}",JSON.toJSONObject(param), e);rst.setErrorMsg("控制器异常:" + e.getMessage());return rst;}}
分页获取导出的数据
/*** 循环导出** @param param 参数* @return*/public List getAllRows(AdvertiseItemExportParam param, LoginUserModel userModel) {List allRows = new ArrayList<>();ResultModel<PageResult<BottomPoolOfferDTO>> queryList;int index = 1;do {param.setPageNum(index++);param.setPageSize(500);queryList = advertiseItemService.queryList(param, userModel);AssertUtil.isTrue(Objects.nonNull(queryList) && queryList.isSuccess(), "查询商品数据失败");AssertUtil.notNull(queryList.getModule(), "查询商品数据失败");List<BottomPoolOfferDTO> records = queryList.getModule().getResultList();if (org.apache.commons.collections.CollectionUtils.isNotEmpty(records)) {if (userModel.isAgentUser()) {// 代理allRows.addAll(records.stream().map(OfferExportAgency::fromBottomPoolOfferDTO).collect(Collectors.toList()));} else {// 运营allRows.addAll(records.stream().map(OfferExportOperator::fromBottomPoolOfferDTO).collect(Collectors.toList()));}}}// 如果当前已导出数据小于全量数据,同时后面还有可查询页时,继续循环查询;while ((allRows.size() < param.getExportSize()) && (index <= queryList.getModule().getPaginator().getTotalPage()));return allRows;}
实体类
@Data
@XStreamAlias("offer")
public class OfferExportAgency {@HeaderName(value = "商品主图", width = 50)@XStreamCDATAprivate String mainUrl;@HeaderName(value = "商品id", width = 20)private Long itemId;@HeaderName(value = "商品名称", width = 30)@XStreamCDATAprivate String title;@HeaderName(value = "权益标签", width = 25)private String benefitLabels;@HeaderName("起批量")private Long startOrderNumber;@HeaderName("热度")private Long hotIndex;@HeaderName("吸引力")private Long attractionIndex;@HeaderName(value = "一级分类", width = 20)@XStreamCDATAprivate String cateLevel1Name;@HeaderName("二级分类")@XStreamCDATAprivate String cateLevel2Name;@HeaderName(value = "三级分类", width = 20)@XStreamCDATAprivate String cateLevel3Name;@HeaderName(value = "店铺名称", width = 30)@XStreamCDATAprivate String shopName;@HeaderName(value = "商品图url", width = 100)@XStreamCDATAprivate String imageUrls;public static OfferExportAgency fromBottomPoolOfferDTO(BottomPoolOfferDTO offerDTO) {OfferExportAgency offer = new OfferExportAgency();BeanUtils.copyProperties(offerDTO, offer);// 权益标签if (offerDTO.getBenefitLabels() != null) {offer.setBenefitLabels(offerDTO.getBenefitLabels().parallelStream().map(AdvertiseItemPageQueryParam.BenefitLabelEnum::getDescByCode).collect(Collectors.toList()).toString());}return offer;}}
XStreamCDATA注解
package com.alibaba.china.tagnore.web.utils;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface XStreamCDATA {}相关文章:
XStream导出xml文件
最终效果 pom依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.11.1</version></dependency>代码 XStreamUtil 这个直接复制即可 import com.thoughtworks.xst…...
陪诊小程序搭建:构建便捷医疗陪诊服务的创新实践
在当今快节奏的社会,医疗服务与人们的生活息息相关。然而,在医疗体系中,患者往往面临着信息不对称、流程繁琐、陪伴需求得不到满足等问题。为了解决这些问题,我们提出了一种创新的解决方案——陪诊小程序,旨在为患者提…...
0139__TCP协议
全网最详细TCP参数讲解,再也不用担心没有面试机会了_tcp的参数-CSDN博客 TCP协议详解-腾讯云开发者社区-腾讯云 TCP-各种参数 - 简书...
家政小程序的开发,带动市场快速发展,提高家政服务质量
当下生活水平逐渐提高,也增加了年轻人的工作压力,同时老龄化也在日益增加,使得大众对家政的需求日益提高,能力、服务质量高的家政人员能够有效提高大众的生活幸福指数。 但是,传统的家政服务模式存在着效率低、用户与…...
JavaScript高级程序设计(第四版)--学习记录之对象、类与面向对象编程(下)
类 ES6新引入class关键字具有正式定义类的能力。 类定义:类声明和类表达式。 // 类声明 class Person {} // 类表达式 const Animal class {}; 类定义与函数定义的不同: 1:函数声明可以提升,类定义不能 2:函数受函数…...
PDF 生成(5)— 内容页支持由多页面组成
当学习成为了习惯,知识也就变成了常识。 感谢各位的 关注、点赞、收藏和评论。 新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn 文章已收录到 github 仓库 liyongning/blog,欢迎 Watch 和 Star。 回顾 在本篇开始…...
day 51 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离
115. 不同的子序列 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 7 取模。 示例 1: 输入:s "rabbbit", t "rabbit" 输出:3 解释: 如下所示,…...
http包详解
http包的作用及使用 go的http包是go的web编程的核心内容,go的web框架本质上都是基于http提供的组件进行再度封装。我们来看一下http基本的使用: func main() {http.Handle("/get", GetVal())http.Handle("/hello", Hello())http.H…...
Reqable实战系列:Flutter移动应用抓包调试教程
Flutter应用网络请求调试一直是业内难题,原因在于Dart语言标准库的网络请求不会走Wi-Fi代理,常规通过配置Wi-Fi代理来抓包的方式行不通。这给我们日常开发测试造成了很大的阻碍,严重降低工作效率。因此写一篇教程,讲解如何使用Req…...
乾元通渠道商中标吴忠市自然灾害应急能力提升项目
近日,乾元通渠道商中标宁夏回族自治区吴忠市自然灾害应急能力提升项目,乾元通作为设备厂家,为项目提供通信指挥类装备(多链路聚合设备)QYT-X1。 青岛乾元通数码科技有限公司作为国家应急产业企业,深耕于数据…...
护网蓝队面试
一、sql注入分类 **原理:**没有对用户输入项进行验证和处理直接拼接到查询语句中 查询语句中插⼊恶意SQL代码传递后台sql服务器分析执行 **从注入参数类型分:**数字型注入、字符型注入 **从注入效果分:**报错注入、布尔注入、延时注入、联…...
【高考志愿】金融学
目录 一、金融学类专业概述 二、主要课程 三、就业前景与方向 四、适合人群 五、金融学学科排名 六、总结 高考志愿选择金融学,无疑是一个既充满挑战又极具前景的决策。金融学,作为经济学门类下的重要分支,不仅涵盖了广泛的金融领域知识…...
返利App的用户行为分析与数据驱动决策
返利App的用户行为分析与数据驱动决策 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨返利App中的用户行为分析与数据驱动决策的技术细节和实…...
python基础:高级数据类型:集合
1、集合的定义 集合是一个无序且无重复元素的列表。其定义与数学定义一致。其无序和不重复和字典特征类似,但是无“值”。 2、集合的创建 集合一般由列表创建,在初始化列表时保证其元素唯一性,即为集合。 创建方法:x set(list…...
idk17配置
只需要把zip包解压,然后配置环境变量: bin目录路径粘到path里面就好了 然后打开cmd窗口分别输入 java javac java -version 验证...
Java实现日志全链路追踪.精确到一次请求的全部流程
广大程序员在排除线上问题时,会经常遇见各种BUG.处理这些BUG的时候日志就格外的重要.只有完善的日志才能快速有效的定位问题.为了提高BUG处理效率.我决定在日志上面优化.实现每次请求有统一的id.通过id能获取当前接口的全链路流程走向. 实现效果如下: 一次查询即可找到所有关…...
你敢相信吗,AI绘画正在逐渐取代你的工作!
前言 在当今信息技术高速发展的时代,AI绘画技术的崛起已引起了广泛关注和讨论。许多人开始担心AI技术是否会逐渐取代传统绘画师的工作。人类无疑是感性的动物,创作出来的艺术作品常常带有浓郁的个人风格和情感。但AI绘画在某些方面的突破,使…...
博途PLC轴工艺对象随动误差监视功能
S7-1200PLC和V90总线伺服通过工艺对象实现定位控制时在组态工艺对象里有这样的随动误差监视功能介绍,关于这个功能,今天我们解读下,工艺对象组态编程可以参考下面文章链接: S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)_v90工艺对象3号报文-CSDN博客文…...
《昇思25天学习打卡营第24天 | 昇思MindSporeResNet50图像分类》
24天 本节学习了使用ResNet50网络对CIFAR-10数据集进行分类。 步骤: 1.数据集准备与加载 2.构建网络 残差网络结构(Residual Network)是ResNet网络的主要亮点,ResNet使用残差网络结构后可有效地减轻退化问题,实现更深的网络结构设计&#x…...
糟糕的管理者都有这几个特征
在我们的职业生涯中,我们都期望能遇到一位英明睿智、引领团队走向辉煌的管理者。然而,现实往往并非总是如此美好,总会有一些管理能力差的人混迹其中,给团队带来诸多困扰。今天,我们就来看看糟糕的管理者身上都有哪些特…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
