XML Map 相互转换

  1. import java.io.IOException;  
  2. import java.io.Reader;  
  3. import java.io.StringReader;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9. import org.jdom.Attribute;  
  10. import org.jdom.Document;  
  11. import org.jdom.Element;  
  12. import org.jdom.JDOMException;  
  13. import org.jdom.input.SAXBuilder;  
  14. import org.jdom.output.Format;  
  15. import org.jdom.output.XMLOutputter;  
  16. public class XmlUtil {  
  17.  /** 
  18.   * 取得xml文件的根节点名称,即消息名称。 
  19.   * @param xmlStr xml内容 
  20.   * @return String 返回名称 
  21.   */  
  22.  public static String getRootName(String xmlStr) throws Exception {  
  23.   SAXBuilder builder = new SAXBuilder();  
  24.   Document doc = builder.build(new StringReader(xmlStr));  
  25.   Element root = doc.getRootElement();  
  26.   return root.getName();  
  27.  }  
  28.    
  29.  /** 
  30.   * 把xml文件转换为map形式,其中key为有值的节点名称,并以其所有的祖先节点为前缀,用 
  31.   * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType 
  32.   * @param xmlStr xml内容 
  33.   * @return Map 转换为map返回 
  34.   */  
  35.  public static Map<String , String> xml2Map(String xmlStr) throws JDOMException, IOException {  
  36.   Map<String , String> rtnMap = new HashMap<String , String>();  
  37.   SAXBuilder builder = new SAXBuilder();  
  38.   Document doc = builder.build(new StringReader(xmlStr));  
  39.   // 得到根节点  
  40.   Element root = doc.getRootElement();  
  41.   String rootName = root.getName();  
  42.   rtnMap.put("root.name", rootName);  
  43.   // 调用递归函数,得到所有最底层元素的名称和值,加入map中  
  44.   convert(root, rtnMap, rootName);  
  45.   return rtnMap;  
  46.  }  
  47.  /** 
  48.   * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。 
  49.   * @param e xml节点,包括根节点 
  50.   * @param map 目标map 
  51.   * @param lastname 从根节点到上一级节点名称连接的字串 
  52.   */  
  53.  public static void convert(Element e, Map<String , String> map, String lastname) {  
  54.   if (e.getAttributes().size() > 0) {  
  55.    Iterator it_attr = e.getAttributes().iterator();  
  56.    while (it_attr.hasNext()) {  
  57.     Attribute attribute = (Attribute)it_attr.next();  
  58.     String attrname = attribute.getName();  
  59.     String attrvalue = e.getAttributeValue(attrname);  
  60.     map.put(lastname + "." + attrname, attrvalue);  
  61.    }  
  62.   }  
  63.   List children = e.getChildren();  
  64.   Iterator it = children.iterator();  
  65.   while (it.hasNext()) {  
  66.    Element child = (Element) it.next();  
  67.    String name = lastname + "." + child.getName();  
  68.    // 如果有子节点,则递归调用  
  69.    if (child.getChildren().size() > 0) {  
  70.     convert(child, map, name);  
  71.    } else {  
  72.     // 如果没有子节点,则把值加入map  
  73.     map.put(name, child.getText());  
  74.     // 如果该节点有属性,则把所有的属性值也加入map  
  75.     if (child.getAttributes().size() > 0) {  
  76.      Iterator attr = child.getAttributes().iterator();  
  77.      while (attr.hasNext()) {  
  78.       Attribute attribute = (Attribute)attr.next();  
  79.       String attrname = attribute.getName();  
  80.       String attrvalue = child.getAttributeValue(attrname);  
  81.       map.put(name + "." + attrname, attrvalue);  
  82.      }  
  83.     }  
  84.    }  
  85.   }  
  86.  }  
  87.  /** 
  88.   * 把xml文件转换为list形式,其中每个元素是一个map,map中的key为有值的节点名称,并以其所有的祖先节点为前缀,用 
  89.   * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType 
  90.   * @param xmlStr xml内容 
  91.   * @return Map 转换为map返回 
  92.   */  
  93.  public static List<Map<String,String>> xml2List(String xmlStr) throws JDOMException, IOException {  
  94.   List<Map<String,String>> rtnList = new ArrayList<Map<String,String>>();  
  95.   Map<String , String> rtnMap = new HashMap<String , String>();  
  96.   SAXBuilder builder = new SAXBuilder();  
  97.   Document doc = builder.build(new StringReader(xmlStr));  
  98.   // 得到根节点  
  99.   Element root = doc.getRootElement();  
  100.   String rootName = root.getName();  
  101.   rtnMap.put("root.name", rootName);  
  102.   // 调用递归函数,得到所有最底层元素的名称和值,加入map中  
  103.   convert2List(root, rtnMap, rootName, rtnList);  
  104.   if(rtnList.size()==0)  
  105.    rtnList.add(rtnMap);  
  106.   return rtnList;  
  107.  }  
  108.  /** 
  109.   * 递归函数,找出最下层的节点并加入到map中,如果有相同的节点,则加入list中, 
  110.   * 由xml2List方法调用。 
  111.   * @param e xml节点,包括根节点 
  112.   * @param map 目标map 
  113.   * @param lastname 从根节点到上一级节点名称连接的字串 
  114.   * @param list 相同节点生成map放入list中 
  115.   */  
  116.  public static void convert2List(Element e, Map<String , String> map, String lastname, List<Map<String,String>> list) {  
  117.   if (e.getAttributes().size() > 0) {  
  118.    Iterator it_attr = e.getAttributes().iterator();  
  119.    while (it_attr.hasNext()) {  
  120.     Attribute attribute = (Attribute)it_attr.next();  
  121.     String attrname = attribute.getName();  
  122.     String attrvalue = e.getAttributeValue(attrname);  
  123.     map.put(lastname + "." + attrname, attrvalue);  
  124.    }  
  125.   }  
  126.   List children = e.getChildren();  
  127.   Iterator it = children.iterator();  
  128.   while (it.hasNext()) {  
  129.    Element child = (Element)it.next();  
  130.    String name = lastname + "." + child.getName();  
  131.    // 如果有子节点,则递归调用  
  132.    if (child.getChildren().size() > 0) {  
  133.     convert(child, map, name);  
  134.    } else {  
  135.     // 如果没有子节点,则把值加入map  
  136.     map.put(name, child.getText());  
  137.     // 如果该节点有属性,则把所有的属性值也加入map  
  138.     if (child.getAttributes().size() > 0) {  
  139.      Iterator attr = child.getAttributes().iterator();  
  140.      while (attr.hasNext()) {  
  141.       Attribute attribute = (Attribute)attr.next();  
  142.       String attrname = attribute.getName();  
  143.       String attrvalue = child.getAttributeValue(attrname);  
  144.       map.put(name + "." + attrname, attrvalue);  
  145.      }  
  146.     }  
  147.    }  
  148.    //如果有相同节点,则加入list中,不考虑子节点中又有相同节点的情况  
  149.    if(e.getChildren(child.getName()).size()>1){  
  150.     Map<String,String> aMap = new HashMap<String,String>();  
  151.     aMap.putAll(map);  
  152.     list.add(aMap);  
  153.     map= new HashMap<String,String>();  
  154.     map.put("root.name", aMap.get("root.name"));  
  155.    }  
  156.   }  
  157.  }  
  158.   
  159.  /** 
  160.   * 打印map 的所有key和value 
  161.   * @param map 
  162.   */  
  163.  public static void printMap(Map<String , String> map) {  
  164.   Iterator<String> keys = map.keySet().iterator();  
  165.   while (keys.hasNext()) {  
  166.    String key =  keys.next();  
  167.    System.out.println(key + ":" +  map.get(key));  
  168.   }  
  169.  }  
  170.    
  171.     /** 
  172.      * 格式化xml 
  173.      * @param xmlStr 
  174.      * @param encode 
  175.      * @return String 
  176.      * @date Apr 30, 2008 
  177.      */  
  178.     @SuppressWarnings("deprecation")  
  179.  public static String formatXml(String xmlStr, String encode ) {  
  180.         
  181.   SAXBuilder sb = new SAXBuilder();  
  182.   Reader reader = new StringReader(xmlStr);  
  183.     
  184.   Document doc = null;  
  185.   try {  
  186.    doc = sb.build(reader);  
  187.   }  
  188.   catch (Exception e) {  
  189.    //do nosth  
  190.   }  
  191.     
  192.   XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());  
  193.         outputter.setEncoding(encode);  
  194.   String result = "" ;  
  195.   if(null != doc){  
  196.    result = outputter.outputString(doc);  
  197.   }  
  198.     
  199.   return result;  
  200.  }  
  201. }

你可能感兴趣的:(map,xlm)