XML转换为Map

传过来一个xml文件,需要转换成Map,能够应对不同结构的xml,而不是只针对固定格式的xml. 
转换规则: 
1.主要是Map与List的互相嵌套 
2.同名称的节点会被装进List 

如下面的xml文件:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <GmMail>  
  3.     <template_id>2</template_id>  
  4.     <to_address>test@corp.gm.com</to_address>  
  5.     <to_alias>tom</to_alias>  
  6.     <message>XML-未来世界 Message</message>  
  7.     <recipient_name>xml-tom</recipient_name>  
  8.     <send_address>xml-test@163.com</send_address>  
  9.     <sender_comp_name>xml-gm</sender_comp_name>  
  10.     <subject>xml-hello guys</subject>  
  11.     <selected_items>  
  12.         <item_group>  
  13.             <item_url>http://china.gm.com</item_url>  
  14.             <item_name>gm中文站</item_name>  
  15.             <item_desc>gm中文站desc</item_desc>  
  16.             <item_desc2>gm中文站desc2</item_desc2>  
  17.             <item_desc3>gm中文站desc3</item_desc3>  
  18.             <item_desc4>gm中文站desc4</item_desc4>  
  19.         </item_group>  
  20.         <items_source>products</items_source>  
  21.         <item_group>  
  22.             <item_url>http://www.gm.com</item_url>  
  23.             <item_name>gm</item_name>  
  24.             <item_desc>gmdesc</item_desc>  
  25.         </item_group>  
  26.     </selected_items>  
  27.     <attachments>  
  28.         <attachment-group>  
  29.             <attachment_url>  
  30.                 http://china.gm.com/pics/com.cn.gm/story/frsc.jpg  
  31.             </attachment_url>  
  32.             <attachment_name>黄晓豫</attachment_name>  
  33.             <attachment_desc>  
  34.                 <desc1>attach-desc1</desc1>  
  35.                 <desc2>attach-desc2</desc2>  
  36.                 <desc3>attach-desc3</desc3>  
  37.                 <desc4>attach-desc4</desc4>  
  38.             </attachment_desc>  
  39.         </attachment-group>  
  40.         <attachment-group>  
  41.             <attachment_url>  
  42.                 http://china.gm.com/pics/com.cn.gm/story/wr.jpg  
  43.             </attachment_url>  
  44.             <attachment_name>张中汉</attachment_name>  
  45.             <attachment_desc>  
  46.                 <desc1>attach-desc1</desc1>  
  47.                 <desc2>attach-desc2</desc2>  
  48.             </attachment_desc>  
  49.             <attachment_desc>  
  50.                 <desc1>attach-desc1</desc1>  
  51.                 <desc2>attach-desc2</desc2>  
  52.             </attachment_desc>  
  53.         </attachment-group>  
  54.     </attachments>  
  55.     <desc_group>  
  56.         <desc_item>desc_item_1</desc_item>  
  57.         <desc_item>desc_item_2</desc_item>  
  58.         <desc_item>desc_item_3</desc_item>  
  59.         <desc_item>desc_item_4</desc_item>  
  60.         <desc_item>desc_item_5</desc_item>  
  61.     </desc_group>  
  62. </GmMail>  

 

转换后的的Map(转换成字符串的效果):

[xhtml]  view plain copy
  1. 1. {message=XML-未来世界 Message, selected_items={items_source=productsitem_group= [{item_name=gm中文站, item_desc=gm中文站desc, item_desc2=gm中文站 desc2, item_desc4=gm中文站desc4, item_url=http://china.gm.com, item_desc3=gm 中文站 desc3}, {item_name=gmitem_desc=gmdescitem_url=http://www.gm.com}]}, to_alias=tomdesc_group= {desc_item= [desc_item_1, desc_item_2, desc_item_3, desc_item_4, desc_item_5]}, sender_comp_name=xml- gm, subject=xml- hello guys, to_address=test@corp.gm.com, template_id=2attachments= {attachment-group=[{attachment_url=http://china.gm.com/pics/com.cn.gm /story/frsc.jpg, attachment_name=黄晓豫, attachment_desc={desc3=attach- desc3, desc4=attach-desc4, desc1=attach-desc1, desc2=attach- desc2}}, {attachment_url=http://china.gm.com/pics/com.cn.gm/story /wr.jpg, attachment_name=张中汉, attachment_desc=[{desc1=attach- desc1, desc2=attach-desc2}, {desc1=attach-desc1, desc2=attach-desc2}]}]}, recipient_name=xml-tom, send_address=xml-test@163.com}    

 

xml处理用的dom4j

[java]  view plain copy
  1. package xml.dom4j;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. import org.dom4j.Document;  
  8. import org.dom4j.Element;  
  9. public class XmlUtils {  
  10.       
  11.     public static Map<String, Object> Dom2Map(Document doc){  
  12.         Map<String, Object> map = new HashMap<String, Object>();  
  13.         if(doc == null)  
  14.             return map;  
  15.         Element root = doc.getRootElement();  
  16.         for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {  
  17.             Element e = (Element) iterator.next();  
  18.             //System.out.println(e.getName());  
  19.             List list = e.elements();  
  20.             if(list.size() > 0){  
  21.                 map.put(e.getName(), Dom2Map(e));  
  22.             }else  
  23.                 map.put(e.getName(), e.getText());  
  24.         }  
  25.         return map;  
  26.     }  
  27.       
  28.     public static Map Dom2Map(Element e){  
  29.         Map map = new HashMap();  
  30.         List list = e.elements();  
  31.         if(list.size() > 0){  
  32.             for (int i = 0;i < list.size(); i++) {  
  33.                 Element iter = (Element) list.get(i);  
  34.                 List mapList = new ArrayList();  
  35.                   
  36.                 if(iter.elements().size() > 0){  
  37.                     Map m = Dom2Map(iter);  
  38.                     if(map.get(iter.getName()) != null){  
  39.                         Object obj = map.get(iter.getName());  
  40.                         if(!obj.getClass().getName().equals("java.util.ArrayList")){  
  41.                             mapList = new ArrayList();  
  42.                             mapList.add(obj);  
  43.                             mapList.add(m);  
  44.                         }  
  45.                         if(obj.getClass().getName().equals("java.util.ArrayList")){  
  46.                             mapList = (List) obj;  
  47.                             mapList.add(m);  
  48.                         }  
  49.                         map.put(iter.getName(), mapList);  
  50.                     }else  
  51.                         map.put(iter.getName(), m);  
  52.                 }  
  53.                 else{  
  54.                     if(map.get(iter.getName()) != null){  
  55.                         Object obj = map.get(iter.getName());  
  56.                         if(!obj.getClass().getName().equals("java.util.ArrayList")){  
  57.                             mapList = new ArrayList();  
  58.                             mapList.add(obj);  
  59.                             mapList.add(iter.getText());  
  60.                         }  
  61.                         if(obj.getClass().getName().equals("java.util.ArrayList")){  
  62.                             mapList = (List) obj;  
  63.                             mapList.add(iter.getText());  
  64.                         }  
  65.                         map.put(iter.getName(), mapList);  
  66.                     }else  
  67.                         map.put(iter.getName(), iter.getText());  
  68.                 }  
  69.             }  
  70.         }else  
  71.             map.put(e.getName(), e.getText());  
  72.         return map;  
  73.     }  
  74. }  

 

下面是一个创建xml的类(不重要,可以忽略,只是用来生成一个xml以便测试,可以自己写)

[java]  view plain copy
  1. package xml.dom4j;  
  2. import org.dom4j.Document;  
  3. import org.dom4j.DocumentHelper;  
  4. import org.dom4j.Element;  
  5. public class CreateXml {  
  6.     /** 
  7.      * @param args 
  8.      */  
  9.     public static void main(String[] args) {  
  10.         // TODO Auto-generated method stub  
  11.     }  
  12.       
  13.     public Document createXml(){  
  14.         Document doc = DocumentHelper.createDocument();  
  15.         Element e = doc.addElement("GmMail");  
  16.         e.addElement("template_id").setText("2");  
  17.         e.addElement("to_address").setText("test@corp.gm.com");  
  18.         e.addElement("to_alias").setText("tom");  
  19.         e.addElement("message").setText("XML-未来世界 Message");  
  20.         e.addElement("recipient_name").setText("xml-tom");  
  21.         e.addElement("send_address").setText("xml-test@163.com");  
  22.         e.addElement("sender_comp_name").setText("xml-gm");  
  23.         e.addElement("subject").setText("xml-hello guys");  
  24.         Element Selecteditems = e.addElement("selected_items");  
  25.               
  26.                 Element itemsGroup = Selecteditems.addElement("item_group");  
  27.             //Element item = itemsGroup.addElement("item");  
  28.                     itemsGroup.addElement("item_url").setText("http://china.gm.com");  
  29.                     itemsGroup.addElement("item_name").setText("gm中文站");  
  30.                     itemsGroup.addElement("item_desc").setText("gm中文站desc");  
  31.                     itemsGroup.addElement("item_desc2").setText("gm中文站desc2");  
  32.                     itemsGroup.addElement("item_desc3").setText("gm中文站desc3");  
  33.                     itemsGroup.addElement("item_desc4").setText("gm中文站desc4");  
  34.                 Selecteditems.addElement("items_source").setText("products");  
  35.                 itemsGroup = Selecteditems.addElement("item_group");  
  36.                     itemsGroup.addElement("item_url").setText("http://www.gm.com");  
  37.                     itemsGroup.addElement("item_name").setText("gm");  
  38.                     itemsGroup.addElement("item_desc").setText("gmdesc");  
  39.         Element attachment = e.addElement("attachments");  
  40.             Element attachmentGroup =   attachment.addElement("attachment-group");  
  41.                 attachmentGroup.addElement("attachment_url").setText("http://china.gm.com/pics/com.cn.gm/story/frsc.jpg");  
  42.                 attachmentGroup.addElement("attachment_name").setText("黄晓豫");  
  43.                     Element attachmentDesc = attachmentGroup.addElement("attachment_desc");  
  44.                     attachmentDesc.addElement("desc1").setText("attach-desc1");  
  45.                     attachmentDesc.addElement("desc2").setText("attach-desc2");  
  46.                     attachmentDesc.addElement("desc3").setText("attach-desc3");  
  47.                     attachmentDesc.addElement("desc4").setText("attach-desc4");  
  48.             attachmentGroup =   attachment.addElement("attachment-group");  
  49.                 attachmentGroup.addElement("attachment_url").setText("http://china.gm.com/pics/com.cn.gm/story/wr.jpg");  
  50.                 attachmentGroup.addElement("attachment_name").setText("张中汉");  
  51.                     attachmentDesc = attachmentGroup.addElement("attachment_desc");  
  52.                         attachmentDesc.addElement("desc1").setText("attach-desc1");  
  53.                         attachmentDesc.addElement("desc2").setText("attach-desc2");  
  54.                     attachmentDesc = attachmentGroup.addElement("attachment_desc");  
  55.                         attachmentDesc.addElement("desc1").setText("attach-desc1");  
  56.                         attachmentDesc.addElement("desc2").setText("attach-desc2");  
  57.         Element descGroup = e.addElement("desc_group");  
  58.             descGroup.addElement("desc_item").setText("desc_item_1");  
  59.             descGroup.addElement("desc_item").setText("desc_item_2");  
  60.             descGroup.addElement("desc_item").setText("desc_item_3");  
  61.             descGroup.addElement("desc_item").setText("desc_item_4");  
  62.             descGroup.addElement("desc_item").setText("desc_item_5");  
  63.         return doc;  
  64.     }  
  65. }  

 

下面是main调用类:

[java]  view plain copy
  1. package xml.dom4j;  
  2. import java.util.Map;  
  3. import org.dom4j.Document;  
  4. public class Demo {  
  5.       
  6.     public static void main(String[] args){  
  7.         CreateXml create = new CreateXml();  
  8.         Document doc = create.createXml();  
  9.         String strXml = doc.asXML();  
  10.         System.out.println(strXml);  
  11.           
  12.         Map map = XmlUtils.Dom2Map(doc);  
  13.           
  14.         System.out.println(map.toString());  
  15.     }  
  16. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值