带属性XML转Map方法(xml转map工具类)

/**
     *@描述 带属性xml转map
     *@参数 xmlStr xml字符串 needRootKey 属性是否转map
     *@返回值 map
     *@创建人 Lixiaolin
     *@创建时间 2021/11/29
     *@修改人和其它信息
     */
    public static Map xml2mapWithAttr(String xmlStr, boolean needRootKey) throws DocumentException {
        Document doc = DocumentHelper.parseText(xmlStr);
        Element root = doc.getRootElement();
        Map<String, Object> map = (Map<String, Object>)xml2mapWithAttr(root);
        if(root.elements().size()==0 && root.attributes().size()==0){
            return map; //根节点只有一个文本内容  
        }
        if(needRootKey){
            //在返回的map里加根节点键(如果需要)  
            Map<String, Object> rootMap = new HashMap<String, Object>();
            rootMap.put(root.getName(), map);
            return rootMap;
        }
        return map;
    }

    /**
     *@描述 带属性xml转map,操作
     *@参数 element
     *@返回值 map
     *@创建人 Lixiaolin
     *@创建时间 2021/11/29
     *@修改人和其它信息
     */
    private static Map xml2mapWithAttr(Element element) {
        Map<String, Object> map = new LinkedHashMap<String, Object>();

        List<Element> list = element.elements();
        List<Attribute> listAttr0 = element.attributes(); // 当前节点的所有属性的list
        for (Attribute attr : listAttr0) {
            map.put("@" + attr.getName(), attr.getValue());
        }
        if (list.size() > 0) {

            for (int i = 0; i < list.size(); i++) {
                Element iter = list.get(i);
                List mapList = new ArrayList();

                if (iter.elements().size() > 0) {
                    Map m = xml2mapWithAttr(iter);
                    if (map.get(iter.getName()) != null) {
                        Object obj = map.get(iter.getName());
                        if (!(obj instanceof List)) {
                            mapList = new ArrayList();
                            mapList.add(obj);
                            mapList.add(m);
                        }
                        if (obj instanceof List) {
                            mapList = (List) obj;
                            mapList.add(m);
                        }
                        map.put(iter.getName(), mapList);
                    } else
                        map.put(iter.getName(), m);
                } else {

                    List<Attribute> listAttr = iter.attributes(); // 当前节点的所有属性的list
                    Map<String, Object> attrMap = null;
                    boolean hasAttributes = false;
                    if (listAttr.size() > 0) {
                        hasAttributes = true;
                        attrMap = new LinkedHashMap<String, Object>();
                        for (Attribute attr : listAttr) {
                            attrMap.put("@" + attr.getName(), attr.getValue());
                        }
                    }

                    if (map.get(iter.getName()) != null) {
                        Object obj = map.get(iter.getName());
                        if (!(obj instanceof List)) {
                            mapList = new ArrayList();
                            mapList.add(obj);
                            // mapList.add(iter.getText());
                            if (hasAttributes) {
                                attrMap.put("#text", iter.getText());
                                mapList.add(attrMap);
                            } else {
                                mapList.add(iter.getText());
                            }
                        }
                        if (obj instanceof List) {
                            mapList = (List) obj;
                            // mapList.add(iter.getText());
                            if (hasAttributes) {
                                attrMap.put("#text", iter.getText());
                                mapList.add(attrMap);
                            } else {
                                mapList.add(iter.getText());
                            }
                        }
                        map.put(iter.getName(), mapList);
                    } else {
                        // map.put(iter.getName(), iter.getText());
                        if (hasAttributes) {
                            attrMap.put("#text", iter.getText());
                            map.put(iter.getName(), attrMap);
                        } else {
                            map.put(iter.getName(), iter.getText());
                        }
                    }
                }
            }
        } else {
            // 根节点的
            if (listAttr0.size() > 0) {
                map.put("#text", element.getText());
            } else {
                map.put(element.getName(), element.getText());
            }
        }
        return map;
    }

    public static void main(String[] args) {
        String xml="<?xml version=\"1.0\"?>" +
                "<ufinterface roottag=\"voucheraddreturn\" docid=\"\" proc=\"add\" sender=\"u8\" receiver=\"930\" request-roottag=\"voucher\">" +
                "    <item accounting_period=\"11\" voucher_type=\"测试\" voucher_id=\"\" entry_id=\"\" succeed=\"0\" dsc=\"已成功保存\" u8accounting_period=\"11\" u8voucher_id=\"41\"></item>" +
                "</ufinterface>";
        try {
            Map<String, Object> stringObjectMap = xml2mapWithAttr(xml,true);
            Map<String, Object> ufinterfaceMap=(Map<String, Object>)stringObjectMap.get("ufinterface");
            Map<String, Object> itemMap=(Map<String, Object>)ufinterfaceMap.get("item");
            String succeed = itemMap.get("@succeed").toString();
            String dsc = itemMap.get("@dsc").toString();
            /*for (String in : itemMap.keySet()) {
                            //map.keySet()返回的是所有key的值
                String str = itemMap.get(in).toString();//得到每个key多对用value的值
                System.out.println(in + "     " + str);
            }*/
            System.out.println(succeed+"  "+dsc);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

注意:属性转Map该方法将属性K加了@,执行顺序,先转第一个节点ufinterface,再转item,再次获取item的属性

参考文章:https://blog.csdn.net/qq_26101151/article/details/53309765

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值