我就直接贴代码了,不太会说,附上注释。

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解析为电子文件》的更多相关文章

  1. 项目上有红色感叹号, 一般就是依赖包有问题, remove依赖,重新加载,maven的也行可认删除,自己也会得新加载

    项目上的红色叹号, 要下面提示: "Problems"  里的errors  , 看是什么错误,  一般是由于网络等原因,  依赖没有下载完整,  只有文件名字对了,  内容不全, ...

  2. Android——PULL解析XML

    简介 Android中常常使用XML文件保存用户的APP设置信息.因此需要对XML文件的相关操作进行了解.本文将以<学生信息管理系统>为案例背景进行介绍相关的XML解析的介绍,以及其他相关 ...

  3. dom4j解析xml文档全面介绍

    一.dom4j介绍 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点, ...

  4. 17.JAVA-Dom、Sax解析XML详解

    在JAVA中,解析有三种方式: Dom解析(支持改删,耗内存). Sax解析(不支持改删,不耗内存). Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习). 1.支持Dom与 ...

  5. JAVA对XML文件的读写(有具体的代码和解析

    XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享. xml指令 处理指令, ...

  6. JavaWeb学习日记----SAX解析XML

    1.SAX解析XML文档的方式: 与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象.优点是可以很方便实现增删改操作.缺点是,如 ...

  7. 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 ...

  8. ZeroMQ接口函数之 :zmq_recvmsg – 从一个socket上接收一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-recvmsg zmq_recvmsg(3)         ØMQ Manual - ØMQ/4.1.0 Nam ...

  9. 将本地已有的一个项目上传到新建的git仓库的方法

    将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...

  10. 怎么将本地已有的一个项目上传到新建的git仓库的方法

    将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...

随机推荐

  1. Linux做bond4

    一.编辑bond网络配置 vim /etc/sysconfig/network-scripts/ifcfg-bond4 DEVICE=bond4 NAME=bond4 TYPE=Bond ONBOOT ...

  2. 5、Math类

    Math类 Math类包含用于执行基本数学运算的方法,如初等数学,对数,平方根和三角函数 常用方法 //Math 常用方法(静态方法) //1.abs 绝对值 int abs = Math.abs(- ...

  3. opencv videocapture

    import time import cv2 import numpy as np from os import path import pickle ''' 关于camera id 此处需要稍微说几 ...

  4. 第二章:视图层 - 10:动态生成PDF文件

    可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成. 一.安装ReportLab ReportLab库在PyPI上提供,可以使用pip来安装: $ pip install ...

  5. 【前端必会】webpack 插件,前进路绕不过的障碍

    背景 webpack的使用中我们会遇到各种各样的插件.loader. webpack的功力主要体现在能理解各个插件.loader的数量上.理解的越多功力越深 开始 https://webpack.do ...

  6. 努力一周,开源一个超好用的接口Mock工具——Msw-Tools

    作为一名前端开发,是不是总有这样的体验:基础功能逻辑和页面UI开发很快速,本来可以提前完成,但是接口数据联调很费劲,耗时又耗力,有时为了保证进度还不得不加加班. 为了摆脱这种痛苦,经过一周的努力,从零 ...

  7. Docker搭建kafka及监控

    环境安装 docker安装 yum update yum install docker # 启动 systemctl start docker # 加入开机启动 systemctl enable do ...

  8. 【Wine使用经验分享】Wine字体显示问题处理

    字体不显示/字体为□ 首先尝试下载simsun字体到/usr/share/fonts (simsun.ttf simsun.ttc) 在新版本wine上,差不多就能解决问题. 如果还不行,就从网上下载 ...

  9. androidmanifest.xml 反编译

    androidmanifest.xml 反编译 去除更新只修改androidmanifest.xml内容 解压apk文件后得到这个文件androidmanifest.xml windwos安装java ...

  10. js动态获取当前时间(年、月、日、上午/下午、时、分、秒)

    //获取动态时间function mytime() { var mydate = new Date(); var year = mydate.getFullYear(); var month = my ...