JAVA 解析xml的工具类

时间:2025-03-10 21:31:32

package ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;
import ;

import .;
import org.;
import org.;
import org.;
import org.;
import org.;
import ;


/**
 * 解析xml的工具类 1、将多层级xml解析为Map 2、将多层级xml解析为Json
 * 
 * @author lmb
 * 
 */
public class ParseXmlUtil {
    public static Logger     logger     = ();
    /**
     * 将xml格式响应报文解析为Json格式
     * 
     * @param responseXmlTemp
     * @return
     * @throws IOException 
     * @throws JDOMException 
     * @throws DocumentException
     */
    public static String xml2Json(String responseXmlTemp, JSONObject node, String currentNode, String listcurrentNode) throws JDOMException, IOException
         {
        
        InputSource source = new InputSource(new StringReader(()));
        SAXBuilder builder = new SAXBuilder();
        Document doc = null;
            doc = (source);
        Element rootElement = ();
        Map<String, Object> mapXml = new TreeMap<String, Object>();
        element2Map(mapXml, rootElement, node, currentNode, listcurrentNode);
        String jsonXml = (mapXml).toString();
        ("Json >>> " + jsonXml);
        return jsonXml;
    }

    /**
     * 将xml格式响应报文解析为Json格式
     * 
     * @param responseXmlTemp
     * @return
     * @throws IOException 
     * @throws JDOMException 
     */
    public static String xml2Json(String responseXmlTemp) throws JDOMException, IOException {
        Document doc = null;
        InputSource source = new InputSource(new StringReader(()));
        SAXBuilder builder = new SAXBuilder();
            doc = (source);
        Element rootElement = ();
        Map<String, Object> mapXml = new TreeMap<String, Object>();
        element2Map(mapXml, rootElement);
        String jsonXml = (mapXml).toString();
        ("Json >>> " + jsonXml);
        return jsonXml;
    }

    /**
     * 将xml格式响应报文解析为Map格式
     * 
     * @param responseXmlTemp
     * @param thirdXmlServiceBean
     * @return
     * @throws IOException 
     * @throws JDOMException 
     * @throws DocumentException
     */
    public static Map<String, Object> xml2map(String responseXmlTemp, JSONObject node, String currentNode,
        String listCurrentNode) throws JDOMException, IOException {
        Document doc = null;
        InputSource source = new InputSource(new StringReader(()));
        SAXBuilder builder = new SAXBuilder();
            doc = (source);
        Element rootElement = ();
        Map<String, Object> mapXml = new TreeMap<String, Object>();
        element2Map(mapXml, rootElement, node, currentNode, listCurrentNode);
        return mapXml;
    }

    public static Map<String, Object> xml2map(String responseXmlTemp) throws JDOMException, IOException {
        Document doc = null;
        InputSource source = new InputSource(new StringReader(()));
        SAXBuilder builder = new SAXBuilder();
            doc = (source);
        Element rootElement = ();
        Map<String, Object> mapXml = new TreeMap<String, Object>();
        element2Map(mapXml, rootElement);
        return mapXml;
    }

    /**
     * 使用递归调用将多层级xml转为map
     * 
     * @param map
     * @param rootElement
     */
    @SuppressWarnings( {"unchecked", "rawtypes"})
    public static void element2Map(Map<String, Object> map, Element rootElement, JSONObject node, String currentNode,
        String listcurrentNode) {
        // 获得当前节点的子节点
        List<Element> elements = ();
        int elementsSize = ();
        if (elementsSize == 0) {
            // 没有子节点说明当前节点是叶子节点,直接取值
            if ((currentNode) != null) {
                if ((currentNode).keySet().toString().contains(())) {
                    ((), ());
                }
            }
        } else if (elementsSize == 1 && !(0).getName().equals(listcurrentNode) ) {
            // 只有一个子节点说明不用考虑list的情况,继续递归
            Map<String, Object> tempMap = new TreeMap<String, Object>();
            if ((currentNode) != null) {
                element2Map(tempMap, (0), (currentNode), (0).getName(),
                    listcurrentNode);
                if ((currentNode).keySet().contains((0).getName())) {
                    ((0).getName(), tempMap);
                }
            }

        } else {
            // 多个子节点的话就要考虑list的情况了,特别是当多个子节点有名称相同的字段时
            Map<String, Object> tempMap = new TreeMap<String, Object>();
            for (Element element : elements) {
                ((), null);
            }
            Set<String> keySet = ();
            for (String string : keySet) {
                Namespace namespace = (0).getNamespace();
                List<Element> sameElements = (string);
                // 如果同名的数目大于1则表示要构建list
                int sameElementSize = ();
                if (sameElementSize > 1) {
                    List<Map> list = new ArrayList<Map>();
                    for (Element element : sameElements) {
                        Map<String, Object> sameTempMap = new TreeMap<String, Object>();
                        if ((currentNode).keySet().toString().contains(string)) {
                            if ((currentNode) != null) {
                                element2Map(sameTempMap, element, (currentNode), string,
                                    listcurrentNode);
                                (sameTempMap);
                            }
                        }
                    }

                    if ((currentNode).keySet().toString().contains(string)) {
                        if ((currentNode) != null) {
                            (string, list);
                        }
                    }
                } else {
                    // 同名的数量不大于1直接递归
                    if (listcurrentNode != null) {
                        String[] strarr = (",");
                        for (int i = 0; i < ; i++) {
                            if (strarr[i].equals(string)) {
                                List<Map> list = new ArrayList<Map>();
                                for (Element element : sameElements) {
                                    Map<String, Object> sameTempMap = new TreeMap<String, Object>();
                                    if ((currentNode).keySet().toString().contains(string)) {
                                        if ((currentNode) != null) {
                                            element2Map(sameTempMap, element, (currentNode), string,
                                                listcurrentNode);
                                            (sameTempMap);
                                        }
                                    }
                                }
                                if ((currentNode).keySet().toString().contains(string)) {
                                    if ((currentNode) != null) {
                                        (string, list);
                                    }
                                }
                            } else {
                                Map<String, Object> sameTempMap = new TreeMap<String, Object>();
                                if ((currentNode).keySet().toString().contains(string)) {
                                    if ((currentNode) != null) {
                                        element2Map(sameTempMap, (0), (currentNode),
                                            string, listcurrentNode);
                                        (string, sameTempMap);
                                    }
                                }
                            }
                        }
                    } else {
                        Map<String, Object> sameTempMap = new TreeMap<String, Object>();
                        if ((currentNode).keySet().toString().contains(string)) {
                            if ((currentNode) != null) {
                                element2Map(sameTempMap, (0), (currentNode), string,
                                    listcurrentNode);
                                (string, sameTempMap);
                            }
                        }
                    }
                }

            }
        }
    }

    public static void element2Map(Map<String, Object> map, Element rootElement) {
        // 获得当前节点的子节点
        List<Element> elements = ();
        int elementsSize = ();
        if (elementsSize == 0) {
            // 没有子节点说明当前节点是叶子节点,直接取值
            // if((currentNode).keySet().toString().contains(())) {
            ((), ());
            // }
        } else if (elementsSize == 1) {
            // 只有一个子节点说明不用考虑list的情况,继续递归
            Map<String, Object> tempMap = new TreeMap<String, Object>();
            element2Map(tempMap, (0));
            // if((currentNode).keySet().contains((0).getName())) {
            ((0).getName(), tempMap);
            // }
        } else {
            // 多个子节点的话就要考虑list的情况了,特别是当多个子节点有名称相同的字段时
            Map<String, Object> tempMap = new TreeMap<String, Object>();
            for (Element element : elements) {
                ((), null);

            }
            Set<String> keySet = ();
            for (String string : keySet) {
                Namespace namespace = (0).getNamespace();
                List<Element> sameElements = (string);
                // 如果同名的数目大于1则表示要构建list
                int sameElementSize = ();
                if (sameElementSize > 1) {
                    List<Map> list = new ArrayList<Map>();
                    for (Element element : sameElements) {
                        Map<String, Object> sameTempMap = new TreeMap<String, Object>();
                        element2Map(sameTempMap, element);
                        (sameTempMap);
                    }
                    (string, list);
                } else {
                    // 同名的数量不大于1直接递归
                    Map<String, Object> sameTempMap = new TreeMap<String, Object>();
                    element2Map(sameTempMap, (0));
                    (string, sameTempMap);
                }
            }
        }

    }

    @SuppressWarnings("unchecked")
    public static void parseData(Map<?, ?> map,JSONObject jsonObject) {
        if (() == 1) {
            for (Object key : ()) {
                Object value = (key);
                if (().startsWith("[") && ().endsWith("]")) {
                    (key, value);
                    // List<?> list = (List<?>)value;
                    // Iterator<?> iterator = ();
                    // while(()){
                    // value = ();
                    // parseData((Map<String, Object>)value);
                    // }
                    // (key+"  "+value);
                } else if (!().startsWith("{") && !().endsWith("}")) {
                    if ((key) != null) {
                        if (!(key).toString().startsWith("[")
                            && !(key).toString().endsWith("]")) {
                            (key, "" + ((String)key).toString() + "|"
                                + (value).toString() + "");
                        } else {
                            (key, "\"" + ((String)key).toString() + "|"
                                + (value).toString() + "\"");
                        }
                    } else {
                        (key, value);
                    }
                } else {
                    parseData((Map<String, Object>)value,jsonObject);
                }
            }
        } else {
            for (Object key : ()) {
                Object value = (key); 
                    if (().startsWith("[") && ().endsWith("]")) {
               
                        // List<?> list = (List<?>)value;
                        // for(int i = 0;i < ();i++)
                        // {
                        // Map<String,Object> map1 = (Map<String, Object>) (i);
                        // parseData(map1);
                        // }
                        if ((key) != null) {
                            (key, "\"" + ((String)key).toString() + "|"
                                + (value).toString() + "\"");
                        } else {
                            (key, value);
                        }
                    } else {
                        if (().startsWith("{") && ().endsWith("}")) {
                        parseData((Map<String, Object>)value,jsonObject);
                        }
                    }
                }
            }
        }
    }

 // 获取一个xml文件
                            String textFromFile = ("");

//currentNode    XML最大的那个key                               

//listcurrentNode  在xml中多个循环的数据

//两个相同的XML key值得value 会按|分割最里面数据得在最第一个,按此规则排列排列1|1|1|1

//调用 将xml解析为Map
                            Map<String, Object> resultMap =
                                ParseXmlUtil.xml2map(textFromFile, nodejson, currentNode, listcurrentNode);