Java读取zip压缩包下xml文件(过滤其他类型文件)

该文章介绍了如何在Java项目中解析XML文件,特别是从ZIP文件中读取XML并转换为JSONObject。作者提供了一个主方法入口,通过自定义工具类将MultipartFile转换为File,然后读取ZIP文件中的XML内容。解析后的数据存储在HashMap中,便于后续业务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

       最近在项目中遇到了需要解析xml,网上找了一圈也没有对应的解析模板,没办法自己手动搞了一个出来,类似的都可以使用,希望尽量可以帮到大家


一、主方法入口

       这里省略controller层直接进来,读取端上传的文件,添加非空判断。inputStream流通过自定义工具类的转换方法转成file文件,再将其转为ZipFile进行循环读取。

/**
 * 读取传入的xml
 */
public Result readXml(MultipartFile multipartFile) throws Exception {
    // 判断是否有文件
    if (multipartFile == null || multipartFile.isEmpty()) {
        return Result.failed("请选择要导入的文件");
    }
    File zipFile = new File(multipartFile.getOriginalFilename());
    // 将zip文件夹中文件通过inputStream形式存入zipFile
    FileUtil.inputStreamToFile(multipartFile.getInputStream(), zipFile);
    HashMap<String, JSONObject> map = readZipFile(zipFile);
    zipFile.delete();
    return Result.success(readXmlRespVO);
}

二、自定义工具类

import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * @author yhl
 * @date 2023/7/19 17:49
 */
@Slf4j
public class FileUtil {

    public static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.flush();
            os.close();
            ins.close();
        } catch (Exception e) {
            log.error(" FileUtil下 --> inputStreamToFile() 异常 {}",e);
        }
    }
}

三、主体解析方法

public HashMap<String, JSONObject> readZipFile(File file) throws Exception {
        ZipFile zip = new ZipFile(file, Charset.forName("GBK"));
        InputStream in = new BufferedInputStream(new FileInputStream(file));
        ZipInputStream zis = new ZipInputStream(in);
        HashMap<String, JSONObject> map = new HashMap<>();
        // 循环zip包下的文件,只读取后缀是xml格式的
        for (Enumeration enumeration = zip.entries(); enumeration.hasMoreElements(); ) {
            ZipEntry ze = (ZipEntry) enumeration.nextElement();
            if (ze.getName().endsWith(".xml") && ze.getSize() > 0) {
                log.info("file - " + ze.getName() + " : " + ze.getSize() + " bytes");
                BufferedReader br = new BufferedReader(new InputStreamReader(zip.getInputStream(ze), StandardCharsets.UTF_8));
                // 解析读取xml
                StringBuffer reqXmlData = new StringBuffer();
                String s;
                while ((s = br.readLine()) != null) {
                    reqXmlData.append(s);
                }
                br.close();
                JSONObject jsonObject = XML.toJSONObject(reqXmlData.toString());
                map.put(ze.getName(), jsonObject);
                log.info("JSONObject {}", JacksonUtil.toJsonString(jsonObject));
            }
        }
        zis.closeEntry();
        zis.close();
        zip.close();
        return map;
    }

       我这里使用map进行返回,是由于业务需求更加方便,小伙伴们以其他方式返回都是可以的。


总结

       以上就是今天要讲的内容了,简单的整合了一个读取zip包中xml文件的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值