XML/map相互转换

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class XmlUtil {

 /**
  * 取得xml文件的根节点名称,即消息名称。
  * @param xmlStr xml内容
  * @return String 返回名称
  */
 public static String getRootName(String xmlStr) throws Exception {
  SAXBuilder builder = new SAXBuilder();
  Document doc = builder.build(new StringReader(xmlStr));
  Element root = doc.getRootElement();
  return root.getName();
 }

 

 /**
  * 把xml文件转换为map形式,其中key为有值的节点名称,并以其所有的祖先节点为前缀,用
  * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType
  * @param xmlStr xml内容
  * @return Map 转换为map返回
  */
 public static Map<String , String> xml2Map(String xmlStr) throws JDOMException, IOException {
  Map<String , String> rtnMap = new HashMap<String , String>();
  SAXBuilder builder = new SAXBuilder();
  Document doc = builder.build(new StringReader(xmlStr));
  // 得到根节点
  Element root = doc.getRootElement();
  String rootName = root.getName();
  rtnMap.put("root.name", rootName);

  // 调用递归函数,得到所有最底层元素的名称和值,加入map中
  convert(root, rtnMap, rootName);

  return rtnMap;
 }

 /**
  * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。
  * @param e xml节点,包括根节点
  * @param map 目标map
  * @param lastname 从根节点到上一级节点名称连接的字串
  */
 public static void convert(Element e, Map<String , String> map, String lastname) {
  if (e.getAttributes().size() > 0) {
   Iterator it_attr = e.getAttributes().iterator();
   while (it_attr.hasNext()) {
    Attribute attribute = (Attribute)it_attr.next();
    String attrname = attribute.getName();
    String attrvalue = e.getAttributeValue(attrname);
    map.put(lastname + "." + attrname, attrvalue);
   }
  }
  List children = e.getChildren();
  Iterator it = children.iterator();
  while (it.hasNext()) {
   Element child = (Element) it.next();
   String name = lastname + "." + child.getName();
   // 如果有子节点,则递归调用
   if (child.getChildren().size() > 0) {
    convert(child, map, name);
   } else {
    // 如果没有子节点,则把值加入map
    map.put(name, child.getText());
    // 如果该节点有属性,则把所有的属性值也加入map
    if (child.getAttributes().size() > 0) {
     Iterator attr = child.getAttributes().iterator();
     while (attr.hasNext()) {
      Attribute attribute = (Attribute)attr.next();
      String attrname = attribute.getName();
      String attrvalue = child.getAttributeValue(attrname);
      map.put(name + "." + attrname, attrvalue);
     }
    }
   }
  }
 }

 /**
  * 把xml文件转换为list形式,其中每个元素是一个map,map中的key为有值的节点名称,并以其所有的祖先节点为前缀,用
  * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType
  * @param xmlStr xml内容
  * @return Map 转换为map返回
  */
 public static List<Map<String,String>> xml2List(String xmlStr) throws JDOMException, IOException {
  List<Map<String,String>> rtnList = new ArrayList<Map<String,String>>();
  Map<String , String> rtnMap = new HashMap<String , String>();
  SAXBuilder builder = new SAXBuilder();
  Document doc = builder.build(new StringReader(xmlStr));
  // 得到根节点
  Element root = doc.getRootElement();
  String rootName = root.getName();
  rtnMap.put("root.name", rootName);

  // 调用递归函数,得到所有最底层元素的名称和值,加入map中
  convert2List(root, rtnMap, rootName, rtnList);
  if(rtnList.size()==0)
   rtnList.add(rtnMap);
  return rtnList;
 }

 /**
  * 递归函数,找出最下层的节点并加入到map中,如果有相同的节点,则加入list中,
  * 由xml2List方法调用。
  * @param e xml节点,包括根节点
  * @param map 目标map
  * @param lastname 从根节点到上一级节点名称连接的字串
  * @param list 相同节点生成map放入list中
  */
 public static void convert2List(Element e, Map<String , String> map, String lastname, List<Map<String,String>> list) {
  if (e.getAttributes().size() > 0) {
   Iterator it_attr = e.getAttributes().iterator();
   while (it_attr.hasNext()) {
    Attribute attribute = (Attribute)it_attr.next();
    String attrname = attribute.getName();
    String attrvalue = e.getAttributeValue(attrname);
    map.put(lastname + "." + attrname, attrvalue);
   }
  }
  List children = e.getChildren();
  Iterator it = children.iterator();
  while (it.hasNext()) {
   Element child = (Element)it.next();
   String name = lastname + "." + child.getName();
   // 如果有子节点,则递归调用
   if (child.getChildren().size() > 0) {
    convert(child, map, name);
   } else {
    // 如果没有子节点,则把值加入map
    map.put(name, child.getText());
    // 如果该节点有属性,则把所有的属性值也加入map
    if (child.getAttributes().size() > 0) {
     Iterator attr = child.getAttributes().iterator();
     while (attr.hasNext()) {
      Attribute attribute = (Attribute)attr.next();
      String attrname = attribute.getName();
      String attrvalue = child.getAttributeValue(attrname);
      map.put(name + "." + attrname, attrvalue);
     }
    }
   }
   //如果有相同节点,则加入list中,不考虑子节点中又有相同节点的情况
   if(e.getChildren(child.getName()).size()>1){
    Map<String,String> aMap = new HashMap<String,String>();
    aMap.putAll(map);
    list.add(aMap);
    map= new HashMap<String,String>();
    map.put("root.name", aMap.get("root.name"));
   }

  }
 }


 /**
  * 打印map 的所有key和value
  * @param map
  */
 public static void printMap(Map<String , String> map) {
  Iterator<String> keys = map.keySet().iterator();
  while (keys.hasNext()) {
   String key =  keys.next();
   System.out.println(key + ":" +  map.get(key));
  }
 }
 
    /**
     * 格式化xml
     * @param xmlStr
     * @param encode
     * @return String
     * @date Apr 30, 2008
     */
    @SuppressWarnings("deprecation")
 public static String formatXml(String xmlStr, String encode ) {
      
  SAXBuilder sb = new SAXBuilder();
  Reader reader = new StringReader(xmlStr);
  
  Document doc = null;
  try {
   doc = sb.build(reader);
  }
  catch (Exception e) {
   //do nosth
  }
  
  XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        outputter.setEncoding(encode);
  String result = "" ;
  if(null != doc){
   result = outputter.outputString(doc);
  }
  
  return result;
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值