java语言如何使用dom4j将bulkPmMrDataFile类型XML文件转为CSV文件

 //生成CSV工具类

package cc.mrbird.febs.util;


import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;

public class XmlToCSVUtils {
    /**
     * 生成为CVS文件
     * @param exportData 源数据List
     * @param fileds 对应的实体类列
     * @param map csv文件的列表头map
     * @param outPutPath 输出?文件路径
     * @param csvFileName 文件名称
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static File createCSVFile(List exportData, String[] fileds, LinkedHashMap map, String outPutPath, String csvFileName) {
        File csvFile = null;
        BufferedWriter csvFileOutputStream = null;
        try {
            File file = new File(outPutPath);
            if (!file.exists()) {
                file.mkdir();
            }
            // 定义文件名格式并创建
            csvFile = new File(outPutPath,csvFileName);
            System.out.println("csv文件导出路径为:" + csvFile);
            // UTF-8使正确读取分隔符","
            csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(csvFile), "GBK"), 1024);
            //System.out.println("csvFileOutputStream" + csvFileOutputStream);

            //写入文件头部
            for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {
                java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
                csvFileOutputStream.write((String) propertyEntry.getValue() != null ? new String(
                        ((String) propertyEntry.getValue()).getBytes("GBK"), "GBK") : "");
                if (propertyIterator.hasNext()) {
                    csvFileOutputStream.write(",");
                }
                //System.out.println(new String(((String) propertyEntry.getValue()).getBytes("GBK"), "GBK"));
            }
            csvFileOutputStream.write("\r\n");

            // 写入文件内容
            for (int j = 0; exportData != null && !exportData.isEmpty()
                    && j < exportData.size(); j++) {
                Header t = (Header) exportData.get(j);
                Class clazz = t.getClass();
                String[] contents = new String[fileds.length];
                for (int i = 0; fileds != null && i < fileds.length; i++) {
                    String filedName = toUpperCaseFirstOne(fileds[i]);
                    Method method = clazz.getMethod(filedName);
                    method.setAccessible(true);
                    Object obj = method.invoke(t);
                    String str = String.valueOf(obj);
                    if (str == null || str.equals("null"))
                        str = "";
                    contents[i] = str;
                }
                for (int n = 0; n < contents.length; n++) {
                    // 将生成的单元格添加到工作表中
                    csvFileOutputStream.write(contents[n]);
                    csvFileOutputStream.write(",");

                }
                csvFileOutputStream.write("\r\n");
            }
            csvFileOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                csvFileOutputStream.close();	//关闭文件流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return csvFile;
    }

    /**
     * .下载文件
     * @param response
     * @param csvFilePath 文件路径
     * @param fileName    文件名称
     * @throws IOException
     */
    public static void exportFile(HttpServletResponse response,
                                  String csvFilePath, String fileName) throws IOException {
        response.setContentType("application/csv;charset=GBK");
        response.setHeader("Content-Disposition", "attachment;  filename="
                + new String(fileName.getBytes("GBK"), "ISO8859-1"));
        // URLEncoder.encode(fileName, "GBK")

        InputStream in = null;
        try {
            in = new FileInputStream(csvFilePath);
            int len = 0;
            byte[] buffer = new byte[1024];
            response.setCharacterEncoding("GBK");
            OutputStream out = response.getOutputStream();
            while ((len = in.read(buffer)) > 0) {
                // out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
                out.write(buffer, 0, len);
            }
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    /**
     * 删除该目录filePath下的所有文件
     * @param filePath 文件目录路径
     */
    public static void deleteFiles(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile()) {
                    files[i].delete();
                }
            }
        }
    }

    /**
     * 删除单个文件
     * @param filePath   文件目录路径
     * @param fileName   文件名称
     */
    public static void deleteFile(String filePath, String fileName) {
        File file = new File(filePath);
        if (file.exists()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile()) {
                    if (files[i].getName().equals(fileName)) {
                        files[i].delete();
                        return;
                    }
                }
            }
        }
    }

    /**
     * 将第一个字母转换为大写字母并和get拼合成方法
     * @param origin
     * @return
     */
    private static String toUpperCaseFirstOne(String origin) {
        StringBuffer sb = new StringBuffer(origin);
        sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
        sb.insert(0, "get");
        return sb.toString();
    }





}

//读取xml工具类

package cc.mrbird.febs.util;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.*;

public class XmlToCsv {

    /**
     * loadXmlImportCSV
     * 解析xml并导出csv
     */
    public static  void loadXmlImportCSV(String fileUrl){
        String csvFileName="";      //csv文件名称
        List<Header> headerList = new ArrayList<Header>();
        SAXReader saxreader = new SAXReader();
        File xmlFile = new File(fileUrl);
        if(xmlFile.exists()) {
            Document document;
            try {
                document = saxreader.read(xmlFile);
                //System.out.println("smr标签下的内容:"+smrelem.getText());
                //获取标签为object下的所有内容
                List<Element> objectList = document.selectNodes("//bulkPmMrDataFile//gNB//measurement[1]//object");
                int vNum = 1; //初始化行数
                int cvsNum = 1; //初始化csv文件数量
                for (int i = 0; i < objectList.size(); i++) {
                    Element object = objectList.get(i);
                    csvFileName="TEST"+"_"+document.getRootElement().element("gNB").attributeValue("id")+"_"+cvsNum+".csv";//以xml文件的eNBid命名
                    if(vNum>=(cvsNum+1)*1000000){
                        cvsNum++;
                        csvFileName="TEST"+"_"+document.getRootElement().element("gNB").attributeValue("id")+"_"+cvsNum+".csv";
                        exportCSV(headerList,csvFileName);
                        headerList=new ArrayList<>();
                    }

                    Iterator<Element> objectIterator = object.elementIterator();
                    while (objectIterator.hasNext()) {
                        vNum++;
                        Element v = objectIterator.next();
                        Header header = new Header();    //创建一个对象
                        //读取fileHeader标签
                        header.setEndTime(document.getRootElement().element("fileHeader").attributeValue("endTime"));
                        header.setFileFormatVersion(document.getRootElement().element("fileHeader").attributeValue("fileFormatVersion"));
                        header.setReportTime(document.getRootElement().element("fileHeader").attributeValue("reportTime"));
                        header.setStartTime(document.getRootElement().element("fileHeader").attributeValue("startTime"));
                        //读取object标签
                        header.setAMFPointer(v.getParent().attributeValue("AMFPointer"));
                        header.setAMFRegionID(v.getParent().attributeValue("AMFRegionID"));
                        header.setAMFSetID(v.getParent().attributeValue("AMFSetID"));
                        header.setAMFUENGAPID(v.getParent().attributeValue("AMFUENGAPID"));
                        header.setTimeStamp(v.getParent().attributeValue("TimeStamp"));
                        header.setId(v.getParent().attributeValue("id"));
                        //读取v标签
                        String vs = v.getText();
                        String[] arr = vs.split(" ");
                        header.setAa(arr[0].equals("NIL") ? "NIL" : arr[0]);
                        header.setBb(arr[1].equals("NIL") ? "NIL" : arr[1]);
                        header.setCc(arr[2].equals("NIL") ? "NIL" : arr[2]);
                        header.setDd(arr[3].equals("NIL") ? "NIL" : arr[3]);
                        header.setEe(arr[4].equals("NIL") ? "NIL" : arr[4]);
                        header.setFf(arr[5].equals("NIL") ? "NIL" : arr[5]);
                        header.setGg(arr[6].equals("NIL") ? "NIL" : arr[6]);
                        header.setHh(arr[7].equals("NIL") ? "NIL" : arr[7]);
                        header.setIi(arr[8].equals("NIL") ? "NIL" : arr[8]);
                        header.setJj(arr[9].equals("NIL") ? "NIL" : arr[9]);
                        header.setKk(arr[10].equals("NIL") ? "NIL" : arr[10]);
                        header.setLl(arr[11].equals("NIL") ? "NIL" : arr[11]);
                        header.setMm(arr[12].equals("NIL") ? "NIL" : arr[12]);
                        header.setNn(arr[13].equals("NIL") ? "NIL" : arr[13]);
                        header.setOo(arr[14].equals("NIL") ? "NIL" : arr[14]);
                        header.setPp(arr[15].equals("NIL") ? "NIL" : arr[15]);
                        header.setQq(arr[16].equals("NIL") ? "NIL" : arr[16]);
                        header.setRr(arr[17].equals("NIL") ? "NIL" : arr[17]);
                        header.setSs(arr[18].equals("NIL") ? "NIL" : arr[18]);
                        header.setTt(arr[19].equals("NIL") ? "NIL" : arr[19]);
                        header.setUu(arr[20].equals("NIL") ? "NIL" : arr[20]);
                        header.setVv(arr[21].equals("NIL") ? "NIL" : arr[21]);
                        header.setWw(arr[22].equals("NIL") ? "NIL" : arr[22]);
                        headerList.add(header);
                    }
                }
                if(vNum<1000000){//根据自己情况定义最大行数
                    exportCSV(headerList,csvFileName);  //行数小于一百万行时导出到第一个csv文件下
                }
            } catch (Exception e) {
                e.printStackTrace();
                headerList.clear();
            }
        }
    }

    public static void exportCSV(List headerList, String csvFileName){ //导出csv文件
        LinkedHashMap map = new LinkedHashMap();        //写入csv表头
        map.put("1", "endTime");
        map.put("2", "fileFormatVersion");
        map.put("3", "reportTime");
        map.put("4", "startTime");

        map.put("5", "AMFPointer");
        map.put("6", "AMFRegionID");
        map.put("7", "AMFSetID");
        map.put("8", "AMFUENGAPID");
        map.put("9", "TimeStamp");
        map.put("10", "id");

        map.put("11", "MR.NRScSSRSRP");
        map.put("12", "MR.NRNcSSRSRP");
        map.put("13", "MR.NRScSSRSRQ");
        map.put("14", "MR.NRNcSSRSRQ");
        map.put("15", "MR.NRScSSSINR");
        map.put("16", "MR.NRNcSSSINR");
        map.put("17", "MR.NRScTadv");
        map.put("18", "MR.NRScPHR");
        map.put("19", "MR.NRScArfcn");
        map.put("20", "MR.NRScPci");
        map.put("21", "MR.NRNcArfcn");
        map.put("22", "MR.NRNcPci");
        map.put("23", "MR.LteNcRSRP");
        map.put("24", "MR.LteNcRSRQ");
        map.put("25", "MR.LteNcEarfcn");
        map.put("26", "MR.LteNcPci");
        map.put("27", "MR.hAOA");
        map.put("28", "MR.vAOA");
        map.put("29", "MR.NRUEPlrUL");
        map.put("30", "MR.NRUEPlrDL");
        map.put("31", "MR.PLMN");
        map.put("32", "MR.NRScSSBIndexId");
        map.put("33", "MR.NRNcSSBIndexId");
        String path = fileUrl;
//        String path = "D://SendFloder//exportcsv//";        //csv文件导出路径
        String fileds[] = new String[]{"endTime", "fileFormatVersion", "reportTime", "startTime"
                ,"aMFPointer","aMFRegionID","aMFSetID","aMFUENGAPID","timeStamp","id"
                , "aa", "bb","cc", "dd", "ee", "ff","gg","hh", "ii", "jj", "kk","ll","mm", "nn"
                , "oo", "pp","qq","rr", "ss", "tt", "uu","vv","ww"};// 设置列英文名(也就是实体类里面对应的列名)

        XmlToCSVUtils.createCSVFile(headerList, fileds, map, "F:\\testXmlToCsv\\outCsv", csvFileName);//调用生成csv文件的工具类
    }

    public static String fileUrl;


    /**
     * 测试方法
     * @param args
     */
    public static void main(String [] args) {
        //调用解压文件类 实现解压(没装这个包,解压文件压缩包类型不知道,暂时不解压)
//        UnGzip gzip = new UnGzip();
//        Scanner scanner  = new Scanner(System.in);
//        System.out.print("请输入解析路径:");
//        fileUrl = scanner.next();
//		System.out.println("输入的路径为:"+fileUrl);		//D:/SendFloder/MRO
//        List<String> fileUrls = gzip.getAllFile(fileUrl);	//解析的所有文件的路径
        //获取文件夹下所有文件
        File file = new File("F:\\testXmlToCsv");
        String [] fileName = file.list();
        for(String sss : fileName){
            System.out.println(sss);
        }

        List<String> fileUrls = new ArrayList<>();
        fileUrls.add("F:\\testXmlToCsv\\NR_MRO_HUAWEI_010231121007_3409785_20230327000000.xml");
        //获取文件夹下所有文件
        for (String fileAllUrl : fileUrls){
//            ThreadPoolExecutorFactory.getInstance().run(() -> { //调用异步线程类
//                gzip.unGzipFile(fileAllUrl);	//解压所有文件
                loadXmlImportCSV(fileAllUrl);  //调用解析xml并导出csv的方法
//                loadXmlImportCSV(fileAllUrl.substring(0,fileAllUrl.length()-3));  //调用解析xml并导出csv的方法
//                gzip.delxmlfile(fileUrl,".xml");	//删除解压生成的xml文件
//            });
        }


    }

}

//Header实体类 @Data 为get set方法注解,无此注解请手动添加get set 方法

package cc.mrbird.febs.util;

import lombok.Data;

@Data
public class Header {


    private String endTime;
    private String fileFormatVersion;
    private String reportTime;
    private String startTime;

    private String aMFPointer;
    private String aMFRegionID;
    private String aMFSetID;
    private String aMFUENGAPID;
    private String timeStamp;
    private String id;


    private String aa;
    private String bb;
    private String cc;
    private String dd;
    private String ee;
    private String ff;
    private String gg;
    private String hh;
    private String ii;
    private String jj;
    private String kk;
    private String ll;
    private String mm;
    private String nn;
    private String oo;
    private String pp;
    private String qq;
    private String rr;
    private String ss;
    private String tt;
    private String uu;
    private String vv;
    private String ww;
//    private String nRScSSRSRP;
//    private String nRNcSSRSRP;
//    private String nRScSSRSRQ;
//    private String nRNcSSRSRQ;
//    private String nRScSSSINR;
//    private String nRNcSSSINR;
//    private String nRScTadv;
//    private String nRScPHR;
//    private String nRScArfcn;
//    private String nRScPci;
//    private String nRNcArfcn;
//    private String nRNcPci;
//    private String lteNcRSRP;
//    private String lteNcRSRQ;
//    private String lteNcEarfcn;
//    private String lteNcPci;
//    private String hAOA;
//    private String vAOA;
//    private String nRUEPlrUL;
//    private String nRUEPlrDL;
//    private String pLMN;
//    private String nRScSSBIndexId;
//    private String nRNcSSBIndexId;
}

maven

<dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

猜你喜欢

转载自blog.csdn.net/qq_37889636/article/details/129966699