上传xml文件并根据内容拆分成多个xml文件

/**
     * 上传XML
     * @param request
     * @param request
     * @return
     */
    @Override
    @Transactional
    public String uploadXML(HttpServletRequest request) throws IOException, ServletException, SAXException, ParserConfigurationException {
        //本地路径
        String filePath = this.saveFilePath + "hz\\xml\\";
        //线上访问路径
        String viewFilePath = this.fileAddress + "hz/xml/";
        // 获取上传的文件
        Part filePart = request.getPart("file");

        // 获取输入流
        InputStream fileContent = filePart.getInputStream();
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        // 解析xml文件
        Document doc = dBuilder.parse(fileContent);

        // 递归解析Element
        Element element = doc.getDocumentElement();
        List<String> list = new ArrayList<>();
        parseElement(element,list);
        String projectnames = list.get(1).split("Name=\"")[1];
        String projectname = projectnames.substring(0,projectnames.length()-2);
        logger.info("projectname:"+projectname);
        String headxml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+"\n"+list.get(0)+"\n"+list.get(1)+"\n"+list.get(2);
        String tailxml = list.get(list.size()-3)+"\n"+list.get(list.size()-2)+"\n"+list.get(list.size()-1);
        String middlexml = "";
        for (int i = 3; i < list.size() - 3; i++) {
            middlexml += list.get(i)+"\n";
        }
        //分组类型
        //背板
        String bbstr = headxml;
        //柜体
        String gtstr = headxml;
        //(门板/封板)
        String mbstr = headxml;
        String[] split = middlexml.split("</Panel>");
        //分组判断2
        String materialListStr = "";
        Map<String, String> materialMap = new HashMap();
        for (int i = 0; i < split.length; i++) {
            String value = split[i]+"</Panel>";
            if(-1 != value.indexOf("Memo=\"背板")){
                bbstr +=value;
            }else if(-1 != value.indexOf("Memo=\"柜体")){
                gtstr +=value;
            }else if(-1 != value.indexOf("Memo=\"门板") || -1 != value.indexOf("Memo=\"封板")){
                mbstr += value;
                String material = value.split("Material=\"")[1].split("\"")[0];
                if(-1 != materialListStr.indexOf(material)){
                    materialMap.put(material,materialMap.get(material).toString()+value);
                }else{
                    materialListStr += material+"||";
                    materialMap.put(material,value);
                }
            }
        }
        bbstr += "\n"+tailxml;
        gtstr += "\n"+tailxml;
        mbstr += "\n"+tailxml;

        File file = new File(filePath);
        if (!file.exists()) {
            file.mkdirs();
        }

        try {
            String urls = "";
            String charsetName = "UTF-8"; // 字符编码

            FileOutputStream fileOutputStream = new FileOutputStream(filePath+"背板"+projectname+".xml");
            OutputStreamWriter fileWriter = new OutputStreamWriter(fileOutputStream, charsetName);
            fileWriter.write(bbstr);
            fileWriter.close();
            urls+=viewFilePath+"背板"+projectname+".xml";
            fileOutputStream = new FileOutputStream(filePath+"门板"+projectname+".xml");
            fileWriter = new OutputStreamWriter(fileOutputStream, charsetName);
            fileWriter.write(mbstr);
            fileWriter.close();
            urls+=","+viewFilePath+"门板"+projectname+".xml";
            fileOutputStream = new FileOutputStream(filePath+"柜体"+projectname+".xml");
            fileWriter = new OutputStreamWriter(fileOutputStream, charsetName);
            fileWriter.write(gtstr);
            fileWriter.close();
            urls+=","+viewFilePath+"柜体"+projectname+".xml";
            for (Map.Entry<String, String> entry:materialMap.entrySet()){
                fileOutputStream = new FileOutputStream(filePath+"门板"+projectname+entry.getKey()+".xml");
                fileWriter = new OutputStreamWriter(fileOutputStream, charsetName);
                fileWriter.write(headxml+entry.getValue()+ "\n"+tailxml);
                fileWriter.close();
                urls+=","+viewFilePath+"门板"+projectname+entry.getKey()+".xml";
            }

            return urls;
        } catch (IOException e) {
            logger.info("上传xml解析异常e:"+e.getMessage()+"\n"+e.getCause());
            e.printStackTrace();
        }

        return null;
    }

    // 递归方法
    public void parseElement(Element element, List<String> list) {
        String str = "<" + element.getTagName();
        NamedNodeMap attris = element.getAttributes();
        for (int i = 0; i < attris.getLength(); i++) {
            Attr attr = (Attr) attris.item(i);
            str += " " + attr.getName() + "=\"" + attr.getValue() + "\"";
        }
        str += ">";
        list.add(str);
        NodeList nodeList = element.getChildNodes();
        Node childNode;
        for (int temp = 0; temp < nodeList.getLength(); temp++) {
            childNode = nodeList.item(temp);
            // 判断是否属于节点
            if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                // 判断是否还有子节点
                if(childNode.hasChildNodes()){
                    parseElement((Element) childNode,list);
                } else if (childNode.getNodeType() != Node.COMMENT_NODE) {
                    parseElement((Element) childNode,list);
                }
            }
        }
        list.add("</" + element.getTagName() + ">");
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值