zoukankan      html  css  js  c++  java
  • 解析特殊格式的xml到map

    由于项目特殊,需要解析的xml文档样式特别,所以自己写了一个解析特殊xml的方法

    先提供xml样式

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
        <head>
            <head1>1</head1>
            <head2>2</head2>
            <head3>3</head3>
            <head4>4</head4>
            <head5>5</head5>
            <head6>6</head6>
            <head7>7</head7>
            <head8>8</head8>
            <head9>9</head9>
            <head10>10</head10>
            <head11>11</head11>
        </head>
        <body>
            <body1>1</body1>
            <body2>2</body2>
            <body3>3</body3>
            <body4>4</body4>
            <body5>5</body5>
            <body6>6</body6>
            <body7>7</body7>
            <details>
                <detail>
                    <gradeitem>A</gradeitem>
                    <gradevalue>1</gradevalue>
                </detail>
                <detail>
                    <gradeitem>B</gradeitem>
                    <gradevalue>2</gradevalue>
                </detail>
                <detail>
                    <gradeitem>C</gradeitem>
                    <gradevalue>3</gradevalue>
                </detail>
                <detail>
                    <gradeitem>D</gradeitem>
                    <gradevalue>4</gradevalue>
                </detail>
                <detail>
                    <gradeitem>E</gradeitem>
                    <gradevalue>5</gradevalue>
                </detail>
                <detail>
                    <gradeitem>F</gradeitem>
                    <gradevalue>6</gradevalue>
                </detail>
                <detail>
                    <gradeitem>G</gradeitem>
                    <gradevalue>7</gradevalue>
                </detail>
                <detail>
                    <gradeitem>H</gradeitem>
                    <gradevalue>8</gradevalue>
                </detail>
                <detail>
                    <gradeitem>I</gradeitem>
                    <gradevalue>9</gradevalue>
                </detail>
            </details>
        </body>
    </root>

    看到这个xml大家就知道哪里特殊了吧,首先head部分正常,标签名作为map的key,内容作为value;但是body中有一部分是这个规则,但另一部分是details包着的detail标签,这个<gradeitem>H</gradeitem>标签里包的值是map的key,这个<gradevalue>9</gradevalue>标签里的值是map的value;

    public static Map<String, String> xmlToMap(String data) {
            Map<String, String> map = new HashMap<String, String>();
            ParseRatingData prd = new ParseRatingData();
            Document doc;
            try {
                doc = DocumentHelper.parseText(data);
                Element root = doc.getRootElement();
            } catch (DocumentException e) {
                e.printStackTrace();
            }
            return map;
        }
        

    先获取根节点是必须的了,首先我想的是把details标签内的东西解析掉,然后剩下的是一个规则,也就是要有两种方式去解析该xml

    public static Map<String, String> xmlToMap(String data) {
            Map<String, String> map = new HashMap<String, String>();
            ParseRatingData prd = new ParseRatingData();
            Document doc;
            try {
                doc = DocumentHelper.parseText(data);
                Element root = doc.getRootElement();
                // 解析head
                Element head = root.element("head");
                map.putAll(prd.nodeToMap(head,"head",map));
                // 解析body
                Element body = root.element("body");
                map.putAll(prd.nodeToMap(body,"body",map));
                // 解析details
                Element details = body.element("details");
                List<Element> detailList = details.elements("detail");
                for (Element detail : detailList) {
                    map.put(detail.elementText("gradeitem"), detail.elementText("gradevalue"));
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
            return map;
        }

    这是刚才那个方法的全部代码,解析details部分就是先获取到details下的所有detail,放在一个list集合中,然后分别取得不同标签下的value值作为map的key和value

    细心的同学已经发现nodeToMap(Element ele,String str,Map map)这个方法了吧,下面看看这个方法都写了啥

    public Map<String, String> nodeToMap(Element node,String str,Map<String, String> map){
            if(!str.equals(node.getName())){
                if("details".equals(node.getName())){
                    return map;
                }
                map.put(node.getName(), node.getTextTrim());//当前节点名称,当前节点内容
            }
            //递归遍历当前节点所有的子节点  
            List<Element> listElement=node.elements();//所有一级子节点的list
            for(Element e:listElement){//遍历所有一级子节点  
                nodeToMap(e,"",map);//递归  
            }
            return map;
        }

    这个就是另外一种普通的解析方式,利用递归的方式遍历传入的node参数下的所有的子节点,然后将该节点的标签名作为map的key,值作为map的value

    需要注意的一点就是为了方便,我将参数中加的str实际就是传入node参数的String格式,如果相同,则为父节点,不往map中放,不同的时候表示为子节点才会放在map中

    如果出现details节点,说明body遍历到这儿就拉倒了,接下来是details遍历需要处理的东西,直接return出去就好,这里传入map参数是为了直接在原来的map的基础上直接添加数据。

    解析完毕,大神们有什么意见看法请不吝赐教啊~

    欢迎转载,转载请注明出处

    Java从入门到放弃,MySQL从删库到跑路~~~

  • 相关阅读:
    线程池1-线程池原理
    CompletableFuture 详解
    服务崩溃的本质
    关于C#读取MySql数据时,返回DataTable中某字段数据是System.Array[]形式
    关于VS2010中的TraceDebugging文件夹浅说
    C#更改win7系统时间的代码,以及为什么更改不成功
    在DataColumn.Expression把DateTime转换成String的问题
    C#用委托实现异步,异步与多线程的异同
    DataColumn.Expression提示“...循环引用”的错误
    JDBC插入百万数据,不到5秒!
  • 原文地址:https://www.cnblogs.com/gode/p/7388360.html
Copyright © 2011-2022 走看看