1. 程式人生 > 其它 >Map和xml格式資料互轉

Map和xml格式資料互轉

Map和xml格式資料互轉

     /**
     * map轉xml map中含有根節點的鍵
     * @param map
     * @throws Exception
     */
    public static String map2xml(Map<String, Object> map) throws Exception  {
        Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();
        if(entries.hasNext()){ //獲取第一個鍵建立根節點
            Map.Entry<String, Object> entry = entries.next();
            Document doc = DocumentHelper.createDocument();
            Element root = DocumentHelper.createElement(entry.getKey());
            doc.add(root);
            map2xml((Map)entry.getValue(), root);
            String formatXml = formatXml(doc);
            return formatXml;
        }
        return null;
    }

    /**
     * map轉xml
     * @param map
     * @param body xml元素
     * @return
     */
    private static Element map2xml(Map<String, Object> map, Element body) {
        Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();
        while (entries.hasNext()) {
            Map.Entry<String, Object> entry = entries.next();
            String key = entry.getKey();
            Object value = entry.getValue();
            if(key.startsWith("@")){    //屬性
                body.addAttribute(key.substring(1, key.length()), value.toString());
            } else if(key.equals("#text")){ //有屬性時的文字
                body.setText(value.toString());
            } else {
                if(value instanceof java.util.List ){
                    List list = (List)value;
                    Object obj;
                    for(int i=0; i<list.size(); i++){
                        obj = list.get(i);
                        //list裡是map或String,不會存在list裡直接是list的,
                        if(obj instanceof java.util.Map){
                            Element subElement = body.addElement(key);
                            map2xml((Map)list.get(i), subElement);
                        } else {
                            body.addElement(key).setText((String)list.get(i));
                        }
                    }
                } else if(value instanceof java.util.Map ){
                    Element subElement = body.addElement(key);
                    map2xml((Map)value, subElement);
                } else {
                    body.addElement(key).setText(value.toString());
                }
            }
            //System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
        }
        return body;
    }

    /**
     * 格式化輸出xml
     * @param document
     */
    public static String formatXml(Document document) throws Exception  {
        // 格式化輸出格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        //format.setEncoding("UTF-8");
        StringWriter writer = new StringWriter();
        // 格式化輸出流
        XMLWriter xmlWriter = new XMLWriter(writer, format);
        // 將document寫入到輸出流
        xmlWriter.write(document);
        xmlWriter.close();
        //String xmlStr = writer.toString();
        //org.dom4j.Document document = DocumentHelper.parseText(xmlStr);
        return writer.toString();
    }

    /**
     * 解析xml到map列表
     * @param xml
     * @return
     */
    public static List<Map<String, Object>> xmlStringToMap(String xml){
        List<Map<String, Object>> rslist=new ArrayList<Map<String, Object>>();
        try {
            Document doc = DocumentHelper.parseText(xml);//XML
            // 獲取根節點
            Element rootElt = doc.getRootElement();
            List<Element> list=rootElt.elements();
            if(list!=null&&!list.isEmpty()){
                Map<String, Object> resultMap =null;
                for(Element element:list){
                    resultMap = new HashMap<String, Object>();
                    Iterator itersElIterator = element.elementIterator();
                    while(itersElIterator.hasNext()){
                        Element itemEle = (Element) itersElIterator.next();
                        if(StringUtils.isNotBlank(itemEle.getName())){
                            resultMap.put(itemEle.getName(), itemEle.getTextTrim());
                        }
                    }
                    rslist.add(resultMap);
                }
            }
        } catch (Exception e) {
            LOG.error("解析xml字串失敗",e);
        }
        return rslist;
    }