美文网首页
dom4j -- XML解析

dom4j -- XML解析

作者: saoraozhe3hao | 来源:发表于2019-10-16 11:41 被阅读0次

官网:https://dom4j.github.io/

dom4j 应用组成

1、pom.xml

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.6</version>
        </dependency>

2、直接使用
以微信公众号自动回复为例

    @RequestMapping(value = "", method = RequestMethod.POST)
    public String autoReply(HttpServletRequest request) throws Exception {
        // <![CDATA[]]> 是为了规避 标签值里有标签符号的情况,一般情况可以忽略
        String xml = "<xml><ToUserName><![CDATA[gh_3333333333333]]></ToUserName><FromUserName><![CDATA[***]]></FromUserName><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[86]]></Content></xml>";
        // String xml = new String(ByteStreams.toByteArray(request.getInputStream()));
        // 解析微信发来的XML字符串
        SAXReader reader = new SAXReader();
        Document document = reader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));
        Element root = document.getRootElement();
        String openId = root.selectSingleNode("/xml/FromUserName").getText();
        String developer = root.selectSingleNode("/xml/ToUserName").getText();
        String msgType = root.selectSingleNode("/xml/MsgType").getText();
        
        // 给微信返回XML字符串
        document = DocumentHelper.createDocument();
        root = document.addElement("xml");
        root.addElement("ToUserName").addText(openId);
        root.addElement("FromUserName").addText(developer);
        root.addElement("CreateTime").addText("" + System.currentTimeMillis());
        root.addElement("MsgType").addText("text");
        root.addElement("Content").addText("返回给用户的内容");
        String responseXml = document.asXML();
        return responseXml;
    }

3、XML 与 Map 之间互相转换的工具类

public class XMLUtil {
    public static void main(String[] args) throws Exception{
        String xml = "<xml><ToUserName><![CDATA[gh_333333333333]]></ToUserName><FromUserName><![CDATA[3333333333333]]></FromUserName><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[86]]></Content></xml>";

        // xml 转 Map
        Map rootMap = XMLUtil.parseXml(xml);
        Map topMap = (Map) rootMap.get("xml");
        String openId = (String) topMap.get("FromUserName");
        // 构造Map并转成xml
        rootMap = new HashMap();
        topMap = new HashMap();
        topMap.put("ToUserName", openId);
        rootMap.put("xml", topMap);
        StringBuffer sb = new StringBuffer();
        String responseStr = XMLUtil.parseMap(rootMap, sb);
    }

    public static Map<String, Object> parseXml(String xml) throws DocumentException {
        Map map = new HashMap();
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(new ByteArrayInputStream(xml.getBytes("UTF-8"))); //xml串第一行不能有空格,否则报错
            Element root = document.getRootElement();//得到xml文档根节点元素,即最上层的"<xml>"
            elementTomap(root, map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

    public static Map<String, Object> elementTomap(Element outele, Map<String, Object> outmap) {
        List<Element> list = outele.elements();
        int size = list.size();
        if (size == 0) {
            outmap.put(outele.getName(), outele.getTextTrim());
        } else {
            Map<String, Object> innermap = new HashMap<String, Object>();
            int i = 1;

            for (Element ele1 : list) {
                String eleName = ele1.getName();

                String value = ele1.getText();
                Object obj = innermap.get(eleName);
                if (obj == null) {
                    elementTomap(ele1, innermap);
                } else {
                    if (obj instanceof java.util.Map) {
                        List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
                        list1.add((Map<String, Object>) innermap.remove(eleName));
                        elementTomap(ele1, innermap);
                        list1.add((Map<String, Object>) innermap.remove(eleName));
                        innermap.put(eleName, list1);
                    } else if (obj instanceof String) {

                        innermap.put(eleName + i, value);
                        i++;
                    } else {
                        elementTomap(ele1, innermap);
                        Map<String, Object> listValue = (Map<String, Object>) innermap.get(eleName);
                        ((List<Map<String, Object>>) obj).add(listValue);
                        innermap.put(eleName, obj);
                    }
                }
            }
            outmap.put(outele.getName(), innermap);
        }
        return outmap;
    }

    public static String  parseMap(Map<?, ?> map, StringBuffer sb) {
        Set<?> set = map.keySet();
        for (Iterator<?> it = set.iterator(); it.hasNext();) {
            String key = (String) it.next();
            Object value = map.get(key);
            if (value instanceof HashMap) {
                sb.append("<" + key + ">");
                parseMap((HashMap<?, ?>) value, sb);
                sb.append("</" + key + ">");
            } else if (value instanceof ArrayList) {
                List<?> list = (ArrayList<?>) map.get(key);
                for (int i = 0; i < list.size(); i++) {
                    sb.append("<" + key + ">");
                    Map<?, ?> hm = (HashMap<?, ?>) list.get(i);
                    parseMap(hm, sb);
                    sb.append("</" + key + ">");
                }
            } else {
                sb.append("<" + key + ">" + value + "</" + key + ">");
            }
        }
        return sb.toString();
    }
}

相关文章

网友评论

      本文标题:dom4j -- XML解析

      本文链接:https://www.haomeiwen.com/subject/aqwductx.html