解析特殊格式的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从删库到跑路~~~

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/industrynews/13123.html

(0)
上一篇 2021年7月19日 15:28
下一篇 2021年7月19日 15:28

相关推荐

发表回复

登录后才能评论