dom4j -- XML解析

官网: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();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 3,147评论 1 3
  • 请允许我借鉴前辈们的东西~~~~ 感激不尽~~~~~ 以下为Android 框架排行榜 么么哒~ Android...
    嗯_新阅读 2,636评论 3 32
  • # Awesome Python [![Awesome](https://cdn.rawgit.com/sindr...
    emily_007阅读 2,377评论 0 3
  • 走亲访友还在继续,只是我要开始自己找点有趣的是做了,要知道去亲戚家拜年并不是一件很有趣的事有时候。今天是去二堂姐家...
    我是陶然阅读 213评论 0 0
  • 晚上十点,接到闺蜜的电话,拿起电话就听到那边哭哭啼啼的声音,问什么情况,她说他刚在她的床上离开,在他关门的那一瞬间...
    lia薇阅读 718评论 0 0

友情链接更多精彩内容