我是靠谱客的博主 无奈航空,最近开发中收集的这篇文章主要介绍Springboot-前端文件上传xml后端完成解析前端代码后端效果,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前端代码

<@html title="上传文件" import="layui,sign">
    <div class="layui-upload">
        <button type="button" class="layui-btn layui-btn-normal"
                id="testList">选择文件
        </button>
        <div class="layui-upload-list">
            <table class="layui-table">
                <thead>
                <tr>
                    <th>文件名</th>
                    <th>大小</th>
                    <th>状态</th>
                    <th>路径</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody id="demoList"></tbody>
            </table>
        </div>
        <button type="button" class="layui-btn" id="testListAction">开始上传</button>
    </div>

    <script>
        let files=[];
        layui.use('upload', function(){
            let $ = layui.jquery
                ,upload = layui.upload;

            //多文件列表示例
            let demoListView = $('#demoList')
                ,uploadListIns = upload.render({
                elem: '#testList',
                url: '${base}/demo/uploadXmlFiles',
                // 限制文件大小,单位 KB
                // size: 60,
                accept: 'file',
                //只允许上传文本文件
                exts: 'xml',
                // 可放扩展数据  key-value
                // data:{'ID':277},
                multiple: true,
                auto: false,
                bindAction: '#testListAction',
                choose: function(obj){
                    let files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
                    //读取本地文件
                    obj.preview(function(index, file, result){
                        let tr = $(['<tr id="upload-'+ index +'">'
                            ,'<td>'+ file.name +'</td>'
                            ,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>'
                            ,'<td>等待上传</td>'
                            ,'<td></td>'
                            ,'<td>'
                            ,'<button class="layui-btn layui-btn-mini demo-reload layui-hide">重传</button>'
                            ,'<button class="layui-btn layui-btn-mini layui-btn-danger demo-delete">删除</button>'
                            ,'</td>'
                            ,'</tr>'].join(''));

                        //单个重传
                        tr.find('.demo-reload').on('click', function(){
                            obj.upload(index, file);
                        });

                        //删除
                        tr.find('.demo-delete').on('click', function(){
                            delete files[index]; //删除对应的文件
                            tr.remove();
                            uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
                        });

                        demoListView.append(tr);
                    });
                },
                done: function(res, index, upload){
                    console.log(res);
                    // 上传成功
                    if(res.code === 0){
                        files.push({"fileName":res.fileName,"fileUrl":res.fileUrl,"fileSize":res.fileSize});
                        let json = JSON.stringify(files);
                        //将上传的文件信息加入到集合中并转换成json字符串
                        $("#fileJson").attr("value", json);

                        let fileUrl=res.fileUrl;
                        let tr = demoListView.find('tr#upload-'+ index), tds = tr.children();
                        tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
                        tds.eq(3).html('<span>'+fileUrl+'</span>');
                        //清空操作
                        tds.eq(4).html('');
                        //删除文件队列已经上传成功的文件
                        return delete this.files[index];
                    }
                    this.error(index, upload);
                }
            });
        });
    </script>
</@html>

图像为:
在这里插入图片描述

后端

@PostMapping("/uploadXmlFiles")
@ResponseBody
public Object uploadXmlFiles(MultipartFile file, HttpServletRequest request) throws JSONException{
    File xmlFile = FileUtil.getFileByMvc(file, request, "xml");
    try{
        if(xmlFile.exists()){
            SAXReader saxReader = new SAXReader();
            // 从文件流读入xml数据
            Document document = saxReader.read(xmlFile);
            String json = XmlUtil.xmlToJson(document.getRootElement());

            String savePath = "D:\Files\Tmp\test.xml";
            Document xmlDocument = XmlUtil.jsonToXml(json);
            XmlUtil.writeXml(xmlDocument, savePath, "gb2312");
            return success();
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return fail();
}

自己封装了一个工具类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.*;
import java.util.List;

/**
 * xml工具类
 * @author XmlUtil
 * @date 2022/06/17
 */
public class XmlUtil {

    /**将xml转换为json
     * @param root xml根节点
     * @return json字符串
     */
    public static String xmlToJson(Element root){
        JSONObject jsonObject = xmlToJsonObject(root);
        String json = JSON.toJSONString(jsonObject,
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteDateUseDateFormat);
        return json;
    }

    /**构建json对象,将根节点下的解析后的数据放在根节点下
     * @param element 文档的根节点.
     * @return json对象
     */
    public static JSONObject xmlToJsonObject(Element element){
        JSONObject supJson = new JSONObject();
        JSONObject json = new JSONObject();
        dom4j2Json(element, json);
        supJson.put(element.getName(), json);
        return supJson;
    }

    /**解析当前节点下的所有内容并放入JSONObject中
     * @param element 节点
     * @param json 需要放入的jsonObject
     */
    private static void dom4j2Json(Element element, JSONObject json) {
        // 如果是属性
        for (Object o : element.attributes()) {
            Attribute attr = (Attribute) o;
            if (!isEmpty(attr.getValue())) {
                json.put("-" + attr.getName(), attr.getValue());
            }
        }
        List<Element> chdEl = element.elements();
        // 如果没有子元素,只有一个值
        if (chdEl.isEmpty() && !isEmpty(element.getText())) {
            json.put(element.getName(), element.getText());
        }
        // 有子元素
        for (Element e : chdEl) {
            // 子元素也有子元素
            if (!e.elements().isEmpty()) {
                JSONObject chdjson = new JSONObject();
                dom4j2Json(e, chdjson);
                Object o = json.get(e.getName());
                if (o != null) {
                    JSONArray jsona = null;
                    // 如果此元素已存在,则转为jsonArray
                    if (o instanceof JSONObject) {
                        JSONObject jsono = (JSONObject)o;
                        json.remove(e.getName());
                        jsona = new JSONArray();
                        jsona.add(jsono);
                        jsona.add(chdjson);
                    }
                    if (o instanceof JSONArray) {
                        jsona = (JSONArray)o;
                        jsona.add(chdjson);
                    }
                    json.put(e.getName(), jsona);
                } else {
                    if (!chdjson.isEmpty()) {
                        json.put(e.getName(), chdjson);
                    }
                }
            } else {    // 子元素没有子元素
                for (Object o : element.attributes()) {
                    Attribute attr = (Attribute)o;
                    if (!isEmpty(attr.getValue())) {
                        json.put("-" + attr.getName(), attr.getValue());
                    }
                }
                if (!e.getText().isEmpty()) {
                    json.put(e.getName(), e.getText());
                }
                // 最后一层且有属性
                if (e.getText().isEmpty() && !e.attributes().isEmpty()) {
                    Object oe = json.get(e.getName());
                    if (oe == null) {
                        JSONObject jsonObject = new JSONObject();
                        for (Object o : e.attributes()) {
                            Attribute attr = (Attribute) o;
                            jsonObject.put("-" + attr.getName(), attr.getValue());
                        }
                        json.put(e.getName(), jsonObject);
                    } else {
                        JSONArray jsonArray = new JSONArray();
                        if (oe instanceof JSONObject) {
                            JSONObject oeJsonObject = (JSONObject)oe;
                            jsonArray.add(oeJsonObject);
                        }
                        if (oe instanceof JSONArray) {
                            jsonArray = (JSONArray) oe;
                        }
                        JSONObject jsonObject = new JSONObject();
                        for (Object o : e.attributes()) {
                            Attribute attr = (Attribute) o;
                            if (!isEmpty(attr.getValue())) {
                                jsonObject.put("-" + attr.getName(), attr.getValue());
                            }
                        }
                        jsonArray.add(jsonObject);
                        json.put(e.getName(), jsonArray);
                    }
                }
            }
        }
    }

    /**判断字符串是否为空
     * @param value 字符串
     * @return 布尔
     */
    private static boolean isEmpty(String value) {
        return value == null || value.length() == 0 || "null".equals(value);
    }

    /**将xml内容写入本地
     * @param document xml
     * @param path 存储路径
     * @param format xml格式
     * @return 布尔
     */
    public static boolean writeXml(Document document, String path, String format){
        File file = new File(path);
        OutputFormat of = OutputFormat.createPrettyPrint();
        // 设置编码格式
        of.setEncoding(format);
        try {
            XMLWriter writer = new XMLWriter(new FileOutputStream(file), of);
            writer.write(document);
            writer.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**json字符串转换成xml字符串
     * @param jsonStr json字符串
     * @return xml
     */
    public static Document jsonToXml(String jsonStr){
        JSONObject json = JSON.parseObject(jsonStr);
        Document document = DocumentHelper.createDocument();
        // root对象只能有一个
        for (String rootKey : json.keySet()) {
            Element root = jsonToElement(json.getJSONObject(rootKey), rootKey);
            document.add(root);
            break;
        }
        return document;
    }

    /**
     * @param json json对象
     * @param nodeName 根节点名称
     * @return xml结构
     */
    private static Element jsonToElement(JSONObject json, String nodeName) {
        Element node = DocumentHelper.createElement(nodeName);
        for (String key : json.keySet()) {
            //当前key是属性
            if(key.charAt(0) == '-'){
                String k = key.substring(1, key.length());
                String value = json.get(key).toString();
                node.addAttribute(k, value);
            }else{
                Object child = json.get(key);
                if (child instanceof JSONObject) {
                    node.add(jsonToElement(json.getJSONObject(key), key));
                }else {
                    JSONArray childs = (JSONArray) child;
                    for (int i = 0; i < childs.size(); i++) {
                        JSONObject jsonObject = (JSONObject) childs.get(i);
                        node.add(jsonToElement(jsonObject, key));
                    }
                }
            }
        }
        return node;
    }
}

效果

文件初始内容:

<?xml version="1.0" encoding="gb2312"?> 
<REPORT TableCount="3">
	<DATA DATANAME="1" COMMENTS="1">
		<Row XMID="abc" XH="qwe"/>
	</DATA>
	<DATA DATANAME="2" COMMENTS="2"> 
		<Row XMID="abc" XH="qwe"/>
	</DATA>
	<DATA DATANAME="3" COMMENTS="3">
		<Row XMID="abc" XH="qwe"/>
	</DATA>
	<DATA DATANAME="4" COMMENTS="4">
		<Row XMID="abc" XH="qwe"/>
	</DATA>
</REPORT>

xml转json

{
	"REPORT":{
		"-TableCount":"3",
		"DATA":[
			{
				"-COMMENTS":"1",
				"-DATANAME":"1",
				"Row":{
					"-XH":"qwe",
					"-XMID":"abc"
				}
			},
			{
				"-COMMENTS":"2",
				"-DATANAME":"2",
				"Row":{
					"-XH":"qwe",
					"-XMID":"abc"
				}
			},
			{
				"-COMMENTS":"3",
				"-DATANAME":"3",
				"Row":{
					"-XH":"qwe",
					"-XMID":"abc"
				}
			},
			{
				"-COMMENTS":"4",
				"-DATANAME":"4",
				"Row":{
					"-XH":"qwe",
					"-XMID":"abc"
				}
			}
		]
	}
}

json转xml:

<?xml version="1.0" encoding="gb2312"?>

<REPORT TableCount="3">
  <DATA COMMENTS="1" DATANAME="1">
    <Row XH="qwe" XMID="abc"/>
  </DATA>
  <DATA COMMENTS="2" DATANAME="2">
    <Row XH="qwe" XMID="abc"/>
  </DATA>
  <DATA COMMENTS="3" DATANAME="3">
    <Row XH="qwe" XMID="abc"/>
  </DATA>
  <DATA COMMENTS="4" DATANAME="4">
    <Row XH="qwe" XMID="abc"/>
  </DATA>
</REPORT>

最后

以上就是无奈航空为你收集整理的Springboot-前端文件上传xml后端完成解析前端代码后端效果的全部内容,希望文章能够帮你解决Springboot-前端文件上传xml后端完成解析前端代码后端效果所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部