当前位置: 首页 > news >正文

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 {}
http://www.lryc.cn/news/388279.html

相关文章:

  • 陪诊小程序搭建:构建便捷医疗陪诊服务的创新实践
  • 0139__TCP协议
  • 家政小程序的开发,带动市场快速发展,提高家政服务质量
  • JavaScript高级程序设计(第四版)--学习记录之对象、类与面向对象编程(下)
  • PDF 生成(5)— 内容页支持由多页面组成
  • day 51 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离
  • http包详解
  • Reqable实战系列:Flutter移动应用抓包调试教程
  • 乾元通渠道商中标吴忠市自然灾害应急能力提升项目
  • 护网蓝队面试
  • 【高考志愿】金融学
  • 返利App的用户行为分析与数据驱动决策
  • python基础:高级数据类型:集合
  • idk17配置
  • Java实现日志全链路追踪.精确到一次请求的全部流程
  • 你敢相信吗,AI绘画正在逐渐取代你的工作!
  • 博途PLC轴工艺对象随动误差监视功能
  • 《昇思25天学习打卡营第24天 | 昇思MindSporeResNet50图像分类》
  • 糟糕的管理者都有这几个特征
  • Python (Ansbile)脚本高效批量管理服务器和安全
  • 《数字图像处理与机器视觉》案例三 (基于数字图像处理的物料堆积角快速测量)
  • Postman接口测试工具的原理及应用详解(四)
  • 扛鼎中国AI搜索,天工凭什么?
  • 【Ant Design Vue的更新日志】
  • Elasticsearch环境搭建|ES单机|ES单节点模式启动|ES集群搭建|ES集群环境搭建
  • System.currentTimeMillis() JAVA 转C#
  • 人机交互新维度|硕博电子发布双编码器操作面板、无线操作面板等新品
  • 简单shell
  • Spring Boot + FreeMarker 实现动态Word文档导出
  • 3D生物打印的未来:多材料技术的突破