项目上的业务《接收一个xml信息包进行解析,xml中包含base64解析为电子文件》
我就直接贴代码了,不太会说,附上注释。
ps:需要根据系统字段和xml里面的标签字段进行建表,之后把xml标签的值进行添加。创建表的方法就是拼的sql。
// 在线接收接口
@Transactional(rollbackFor = Exception.class)
@Override
public String online(ColDataRecord colDataRecord, MultipartFile file, HttpServletRequest request) {
//解析token
String token = request.getHeader("token");
//判空
if (token == null || token.isEmpty()) {
return "token不存在";
}
if (file.isEmpty()) {
return "数据包丢失";
}
String userCode = tokenService.getUserCode(token);
Long unitId = tokenService.getUnitId(token);
String userName = tokenService.getUserName(token);
String unitName = tokenService.getUnitName(token);
String fileSign = UUIDutil.getUUID();
//先根据传过来的数据创建file表和efile表
String eFileTableName = TableUtil.getColTableName(colDataRecord.getUnitId(), colDataRecord.getArcId(), "EFILE", 2);
String fileTableName = TableUtil.getColTableName(colDataRecord.getUnitId(), colDataRecord.getArcId(), "FILE", 2);
try {
createTableService.createOnlineTable(colDataRecord.getUnitId(), colDataRecord.getArcId());
} catch (Exception e) {
e.printStackTrace();
return "数据表创建失败";
}
//解析传过来的xml
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
//file表数据map
Map<String, Object> field = new HashMap<>();
//efile表数据集合
List<Map<String, Object>> eFileList = new ArrayList<>();
String xmlName = null;
Res ress = null;
try {
//MultipartFile文件可以通过.getOriginalFilename()来获取到文件的原名
xmlName = file.getOriginalFilename();
MultipartFile[] s = {file};
//数据包上传到minio
ress = archivesManagementService.collectUpload(
new Input(userCode, userName, unitId.toString(), colDataRecord.getArcId().toString(), xmlName, 2, 1), s);
//临时存储到服务器本地,准备解析
String path = ContentsUtil.TEMP_ONLINE + xmlName;
BufferedOutputStream out1 = FileUtil.getOutputStream(path);//path
IoUtil.copy(file.getInputStream(), out1, IoUtil.DEFAULT_BUFFER_SIZE);
//开始解析
//读取xml为Document对象
Document document = reader.read(new File(path));//path
//bookStore 懒得改名 document.getRootElement()获取根元素
Element bookStore = document.getRootElement();
//获取一个迭代器,用于循环子节点
Iterator it = bookStore.elementIterator();
//循环子节点
while (it.hasNext()) {
Element book = (Element) it.next();
//获取标签名称
String labelName = book.getName();
//不是EFILE标签的添加到file
if (!labelName.equals("EFILE")) {
field.put(book.getName(), book.getText());
}
}
//系统参数
field.put("ID", null);
field.put("CREATETIME", DateUtils.getCurrentYMDHMSStr());
field.put("ATTRZB", 0);
field.put("ATTREX", 0);
field.put("STATUS", 0);
field.put("ATTRWEB", 0);
field.put("SIGN", fileSign);
//添加file表数据
onlinePackageMapper.addOnlineFile(fileTableName, field);
//这里重新获取一个迭代器是因为如果继续使用it,那这个it指向的地址也是上面那个it,就会导致运行到这it.hasNext()已经没有下一个标签了。
Iterator<Element> it2 = bookStore.elementIterator();
while (it2.hasNext()) {
//efile会存在多个
Map<String, Object> eFile = new HashMap<>();
Element book = (Element) it2.next();
String labelName = book.getName();
String fileName = null;
Res res = null;
if (labelName.equals("EFILE")) {
Iterator itt = book.elementIterator();
byte[] bytes = null;
//进入EFILE标签里面
while (itt.hasNext()) {
Element bookChild = (Element) itt.next();
String eFileName = bookChild.getName();
if (eFileName.equals("FILENAME")) {
fileName = bookChild.getText();
}
if (eFileName.equals("BASE64")) {
//解析base64
BASE64Decoder decoder = new BASE64Decoder();
bytes = decoder.decodeBuffer(bookChild.getText());
//不落地直接转MultipartFile,因为另一个服务接口参数不一样。
//base64转MultipartFile会出现转出来的文件没有文件信息,所以需要自己添加。当然如果base64带文件信息可能没问题,没试过
MultipartFile multipartFile = new MockMultipartFile("file", fileName, ContentType.MULTIPART.toString(), new ByteArrayInputStream(bytes));
MultipartFile[] files = {multipartFile};
//将解析出来的电子文件上传
res = archivesManagementService.collectUpload(
new Input(userCode, userName, unitId.toString(), colDataRecord.getArcId().toString(), fileName, 2, 2), files);
} else {
//添加其他字段属性
eFile.put(eFileName, bookChild.getText());
}
}
eFile.put("PID", field.get("ID"));
eFile.put("KEYWORD", "");
eFileList.add(eFile);
onlinePackageMapper.addOnlineEFile(eFileTableName, eFile);
}
}
} catch (DocumentException | IOException e) {
e.printStackTrace();
}
//添加数据接收记录信息表
......
return onlinePackageMapper.addDataRecord(colDataRecord) != -1 ? "success" : "接收失败";
}
项目上的业务《接收一个xml信息包进行解析,xml中包含base64解析为电子文件》的更多相关文章
- 项目上有红色感叹号, 一般就是依赖包有问题, remove依赖,重新加载,maven的也行可认删除,自己也会得新加载
项目上的红色叹号, 要下面提示: "Problems" 里的errors , 看是什么错误, 一般是由于网络等原因, 依赖没有下载完整, 只有文件名字对了, 内容不全, ...
- Android——PULL解析XML
简介 Android中常常使用XML文件保存用户的APP设置信息.因此需要对XML文件的相关操作进行了解.本文将以<学生信息管理系统>为案例背景进行介绍相关的XML解析的介绍,以及其他相关 ...
- dom4j解析xml文档全面介绍
一.dom4j介绍 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点, ...
- 17.JAVA-Dom、Sax解析XML详解
在JAVA中,解析有三种方式: Dom解析(支持改删,耗内存). Sax解析(不支持改删,不耗内存). Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习). 1.支持Dom与 ...
- JAVA对XML文件的读写(有具体的代码和解析
XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享. xml指令 处理指令, ...
- JavaWeb学习日记----SAX解析XML
1.SAX解析XML文档的方式: 与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象.优点是可以很方便实现增删改操作.缺点是,如 ...
- ZeroMQ接口函数之 :zmq_recv – 从一个socket上接收一个消息帧
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_recv zmq_recv(3) ØMQ Manual - ØMQ/4.1.0 Name zmq_r ...
- ZeroMQ接口函数之 :zmq_recvmsg – 从一个socket上接收一个消息帧
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-recvmsg zmq_recvmsg(3) ØMQ Manual - ØMQ/4.1.0 Nam ...
- 将本地已有的一个项目上传到新建的git仓库的方法
将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...
- 怎么将本地已有的一个项目上传到新建的git仓库的方法
将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...
随机推荐
- flex常用布局
公共样式: <style> * { margin: 0; padding: 0; } .has-flex { display: flex; } </style> 垂直居中 子元 ...
- 【读书笔记】C#高级编程 第五章 泛型
(一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...
- jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(1)
前言:前面写过2篇文章,介绍jenkins通过slave节点部署构建并发布应用到虚拟机中,本篇介绍k8s(k3s)环境下,部署jenkins,通过流水线脚本方式构建发布应用到k8s(k3s)集群环境中 ...
- Lua CallbackHell优化
概述 在异步操作中,常常要使用回调.但是,回调的嵌套常常会导致逻辑混乱,一步错步步错,难以维护.在Lua中,可以使用协程进行优化. 问题分析 模拟一个回合制游戏攻击过程 local function ...
- 亚马逊云科技现身世界人工智能大会,揭示AI最新技术趋势
2022世界人工智能大会(WAIC)于日前落幕.经过过去四届的发展与沉淀,今天的世界人工智能大会已成为人工智能领域最有影响力的国际盛会之一,今年大咖云集.国际大厂扎堆,充分彰显了大会的国际影响力和磁力 ...
- Exchange备份和日志清除
最近新部署Exchange 2019,虽然变化不大,但是也遇到了一些小问题.随着深入研究,就能发现一些以前被忽视的点.Exchange完成备份后,数据库日志并没有被清除,依然存在.https://ww ...
- G&GH04 本地连接至远程
注意事项与声明 平台: Windows 10 作者: JamesNULLiu 邮箱: jamesnulliu@outlook.com 博客: https://www.cnblogs.com/james ...
- CentOS7添加永久路由
CentOS7永久静态路由需要写到 /etc/sysconfig/network-scripts/route-****** 文件中,故在/etc/sysconfig/network-scripts/下 ...
- CentOS无法识别NTFS格式U盘完美解决方案
问题描述:CentOS上无法识别NTFS格式的U盘 解决方案: # 进入yum目录 cd /etc/yum.repos.d # 下载阿里的epel wget http://mirrors.aliyun ...
- Elasticsearch的mapping讲解
映射是定义文档及其包含的字段的存储和索引方式的过程. 映射定义具有: 元字段 元字段用于自定义如何处理关联的文档元数据.包括文档 _index,_id和 _source领域. 字段或属性 映射包含pr ...