xml解析的工具类

40 篇文章 0 订阅
/**
 * Created by Administrator on 2017/6/2.
 * xml解析的工具类
 * 把xml的所有节点和对应的值,转化为map
 */

public class XMLParserUtil {
    public XMLParserUtil() {
    }

    public static Map<String, Object> paraserXML(InputStream inputStream) {
        HashMap map = new HashMap();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;

        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException var12) {
            var12.printStackTrace();
        }

        Document document = null;

        try {
            document = builder.parse(inputStream);
        } catch (SAXException var10) {
            var10.printStackTrace();
        } catch (IOException var11) {
            var11.printStackTrace();
        }

        Element root = document.getDocumentElement();
        NodeList nodeList = root.getChildNodes();

        for (int i = 0; i < nodeList.getLength(); ++i) {
            Node node = nodeList.item(i);
            doParaser(node, map, (String) null);
        }

        try {
            inputStream.close();
        } catch (Exception var9) {
            ;
        }

        return map;
    }

    public static Map<String, Object> paraserXML(InputStream inputStream, String listNodeName) {
        HashMap map = new HashMap();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;

        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException var12) {
            var12.printStackTrace();
        }

        Document document = null;

        try {
            document = builder.parse(inputStream);
        } catch (SAXException var10) {
            var10.printStackTrace();
        } catch (IOException var11) {
            var11.printStackTrace();
        }

        Element root = document.getDocumentElement();
        NodeList nodeList = root.getChildNodes();

        for (int i = 0; i < nodeList.getLength(); ++i) {
            Node node = nodeList.item(i);
            doParaser(node, map, listNodeName);
        }

        return map;
    }

    private static void doParaser(Node node, Map<String, Object> map, String listNodeName) {
        if (node.getNodeType() == 1) {
            Element element = (Element) node;
            if (isElementChildOf(element, listNodeName)) {
                if (element.getChildNodes().getLength() == 1 && element.getChildNodes().item(0).getNodeType() == 3) {
                    putLeafIntoMapWithSpecified(element, map, 0, listNodeName);
                } else if (element.getChildNodes().getLength() == 0) {
                    putLeafIntoMapWithSpecified(element, map, 0, listNodeName);
                } else if (element.getChildNodes().getLength() == 1 && element.getChildNodes().item(0).getNodeType() == 4) {
                    putLeafIntoMapWithSpecified(element, map, 0, listNodeName);
                }

                doParaser(element, map, listNodeName);
            } else if (element.getChildNodes().getLength() == 1 && element.getChildNodes().item(0).getNodeType() == 3) {
                putLeafIntoMapWithNoSpecified(element, map, 0);
            } else if (element.getChildNodes().getLength() == 0) {
                putLeafIntoMapWithNoSpecified(element, map, 1);
            } else if (element.getChildNodes().getLength() == 1 && element.getChildNodes().item(0).getNodeType() == 4) {
                putLeafIntoMapWithNoSpecified(element, map, 2);
            } else {
                doTravelWithNoSpecified(element, map);
            }
        }

    }

    private static boolean isElementChildOf(Element element, String nodeName) {
        if (nodeName == null) {
            return false;
        } else {
            for (Node node = element.getParentNode(); node != null; node = node.getParentNode()) {
                if (node.getNodeName().equals(nodeName)) {
                    return true;
                }
            }

            return false;
        }
    }

    private static void putLeafIntoMapWithNoSpecified(Element element, Map<String, Object> rootMap, int type) {
        String key = element.getParentNode().getNodeName();
        String value = null;
        switch (type) {
            case 0:
            case 2:
                value = element.getChildNodes().item(0).getNodeValue();
                break;
            case 1:
                value = "null";
        }

        if (rootMap.get(key) != null) {
            if (rootMap.get(key) instanceof List) {
                List elementMap = (List) rootMap.get(key);
                if (((Map) elementMap.get(elementMap.size() - 1)).containsKey(element.getNodeName())) {
                    elementMap.add(buildMap(new String[]{element.getNodeName()}, new String[]{value}));
                } else {
                    ((Map) elementMap.get(elementMap.size() - 1)).put(element.getNodeName(), value);
                }
            }

            if (rootMap.get(key) instanceof Map) {
                Map elementMap1 = (Map) rootMap.get(key);
                if (elementMap1.containsKey(element.getNodeName())) {
                    rootMap.remove(key);
                    ArrayList elementList = new ArrayList();
                    elementList.add(elementMap1);
                    elementList.add(buildMap(new String[]{element.getNodeName()}, new String[]{value}));
                    rootMap.put(key, elementList);
                } else {
                    elementMap1.put(element.getNodeName(), value);
                }
            }
        } else {
            rootMap.put(key, buildMap(new String[]{element.getNodeName()}, new String[]{value}));
        }

    }

    private static void putLeafIntoMapWithSpecified(Element element, Map<String, Object> rootMap, int type, String listNodeName) {
        String value = null;
        switch (type) {
            case 0:
            case 2:
                value = element.getChildNodes().item(0).getNodeValue();
                break;
            case 1:
                value = "null";
        }

        String[] parentNames = getParentNames(element, listNodeName);
        Map tempMap = rootMap;

        for (int map = parentNames.length - 1; map >= 0; --map) {
            if (tempMap.get(parentNames[map]) == null) {
                tempMap.put(parentNames[map], new HashMap());
            }

            tempMap = (Map) tempMap.get(parentNames[map]);
        }

        if (tempMap.containsKey(element.getNodeName())) {
            HashMap var10 = new HashMap();

            for (int listObject = parentNames.length - 2; listObject >= 0; --listObject) {
                if (listObject == 0) {
                    var10.put(parentNames[listObject], value);
                } else {
                    var10.put(parentNames[listObject], new HashMap());
                }
            }

            Object var11 = rootMap.get(listNodeName);
            if (var11 instanceof Map) {
                ArrayList list = new ArrayList();
                list.add((Map) var11);
                list.add(var10);
                rootMap.remove(listNodeName);
                rootMap.put(listNodeName, list);
            }

            if (var11 instanceof List) {
                List var12 = (List) var11;
                var12.add(var10);
            }
        } else {
            tempMap.put(element.getNodeName(), value);
        }

    }

    private static String[] getParentNames(Element element, String listNodeName) {
        ArrayList list = new ArrayList();

        for (String key = element.getParentNode().getNodeName(); !key.equals(listNodeName); key = element.getParentNode().getNodeName()) {
            list.add(key);
        }

        list.add(listNodeName);
        return (String[]) list.toArray();
    }

    private static void doTravelWithNoSpecified(Element node, Map<String, Object> map) {
        for (int i = 0; i < node.getChildNodes().getLength(); ++i) {
            Node tempNode = node.getChildNodes().item(i);
            doParaser(tempNode, map, (String) null);
        }

    }

    private static Map<String, Object> buildMap(String[] keys, String[] values) {
        HashMap map = new HashMap();

        for (int i = 0; i < keys.length; ++i) {
            map.put(keys[i], values[i]);
        }

        return map;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值