package com.css.simulation.resource.server.app.service;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@Slf4j
@Service
public class XmlParse {
    //泛化模板解析需要用
    public static FileItem createFileItem(String filePath, String fileName){
        String fieldName = "file";
        FileItemFactory factory = new DiskFileItemFactory();
        FileItem item = factory.createItem(fieldName, "text/plain", false,fileName);
        File newfile = new File(filePath);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        try (FileInputStream fis = new FileInputStream(newfile);
             OutputStream os = item.getOutputStream()) {
            while ((bytesRead = fis.read(buffer, 0, 8192))!= -1)
            {
                os.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return item;
    }
    //解析xml获取属性地址
    public static Map getUrl(String fileUrl) throws Exception {
        //1-获取XML-IO流
      //  File excelFile = new File(fileUrl); //创建文件对象
        File excelFile = new File("D:\\GB_001_TargetIdentification_001_Right.xml"); //创建文件对象
        InputStream xmlInputStream= new FileInputStream(excelFile); //文件流
        //2-解析XML-IO流 ，获取Document 对象，以及Document对象 的根节点
        Element rootElement = getRootElementFromIs(xmlInputStream);
        //3~5-从根元素解析得到元素
       Map map= parseElementFromRoot(rootElement);//控制台输出：　　　
        System.out.println("xodrName-----"+map.get("xodrName"));
        return map;
    }

    //1-获取XML-IO流
    private static InputStream  getXmlInputStream(String xmlPath){
        InputStream inputStream = null;
        try {
            //1-把要解析的 XML 文档转化为输入流，以便 DOM 解析器解析它
            inputStream= new  FileInputStream(xmlPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return inputStream;
    }
    //2-解析XML-IO流 ，获取Document 对象，以及Document对象 的根节点
    private static Element getRootElementFromIs(InputStream inputStream) throws Exception {
        if(inputStream == null){
            return  null;
        }
        /*
         * javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 ，
         * DocumentBuilderFactory是一个抽象工厂类，它不能直接实例化，但该类提供了一个newInstance方法 ，
         * 这个方法会根据本地平台默认安装的解析器，自动创建一个工厂的对象并返回。
         */
        //2-调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //3-调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
        DocumentBuilder docBuilder = factory.newDocumentBuilder();
        //4-调用 DOM 解析器对象的 parse() 方法解析 XML 文档，得到代表整个文档的 Document 对象，进行可以利用DOM特性对整个XML文档进行操作了。
        Document doc = docBuilder.parse(inputStream);
        //5-得到 XML 文档的根节点
        Element root =doc.getDocumentElement();
        //6-关闭流
        if(inputStream != null){
            inputStream.close();
        }
        return root;
    }

    //3-从根元素解析得到元素
    private static Map parseElementFromRoot(Element root) {
        NodeList nl = root.getChildNodes();
        for (int i = 0; i < nl.getLength(); i++) {
            Node node = nl.item(i);
            if("Layout".equals(node.getNodeName())){
                if (node instanceof Element) {
                    Element ele = (Element) node;
                    //4-从元素解析得到属性值
                    return getDataFromElement(ele);
                //5-从元素解析特定子元素并解析(以property为例)
               // getCertainElementFromParentElement(ele);
                }
            }

        }
        return null;
    }

    //4-从元素解析得到属性值
    private static Map getDataFromElement(Element ele) {
        Map map=new HashMap<>();
        String osgbName = ele.getAttribute("Database");//根据属性名称读取属性值
        String xodrName= ele.getAttribute("File");
        map.put("osgbName",osgbName);
        map.put("xodrName",xodrName);
        return map;
    }
    /*//5-从元素解析特定子元素并解析(以property为例)
    private static void getCertainElementFromParentElement(Element ele) {
        NodeList propertyEleList = ele.getElementsByTagName("Database");//根据标签名称获取标签元素列表
        for (int i = 0; i < propertyEleList.getLength(); i++) {
            Node node = propertyEleList.item(i);
            if (node instanceof Element) {
                Element propertyEle = (Element) node;
                String name = propertyEle.getAttribute("Database");
                System.out.println("propertyEle: Database =88888888= " + name);
                String value = propertyEle.getAttribute("File");
                System.out.println("propertyEle: File ==888888--- " + value);
            }
        }

    }
*/





}
