xml转list

前端之家收集整理的这篇文章主要介绍了xml转list前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_0@ 大家在解析大量相似xml文件的时候是否会遇到这样一个问题:冗余的代码去set定义的实体对象Bean的值,基本都是一样的操作
@H_403_0@
@H_403_0@ 而且毫无任何代码价值可言所以在这写了一个简单的例子,类封装了几个方法你只需传入xml文件,或者URL路径。和Bean.Class 类名
@H_403_0@
@H_403_0@ 即可自动传回你需要的List集合。
@H_403_0@
@H_403_0@ 需要解析的xml文件
@H_403_0@
@H_403_0@ <?xml version="1.0" encoding="UTF-8"?> @H_403_0@ <messages> @H_403_0@ <resultCode>0</resultCode> @H_403_0@ <totalCount>2</totalCount> @H_403_0@ <UserLists> @H_403_0@ <UserList> @H_403_0@ <userId>0</userId> @H_403_0@ <loginName>张三0</loginName> @H_403_0@ <email>qsina0@sina.com</email> @H_403_0@ <userType>1</userType> @H_403_0@ <status>1</status> @H_403_0@ <roleType>1</roleType> @H_403_0@ <registerIP>192.168.1.0</registerIP> @H_403_0@ <registerTime>2012-06-07 15:35:33</registerTime> @H_403_0@ </UserList> @H_403_0@ <UserList> @H_403_0@ <userId>1</userId> @H_403_0@ <loginName>张三1</loginName> @H_403_0@ <email>qsina1@sina.com</email> @H_403_0@ <userType>1</userType> @H_403_0@ <status>1</status> @H_403_0@ <roleType>1</roleType> @H_403_0@ <registerIP>192.168.1.1</registerIP> @H_403_0@ <registerTime>2012-06-07 15:35:33</registerTime> @H_403_0@ </UserList> @H_403_0@ </UserLists> @H_403_0@ </messages> @H_403_0@
@H_403_0@ 在进行相关操作中需要如下包: @H_403_0@
@H_403_0@ 下面是贴出的代码: @H_403_0@
@H_403_0@ package com.jeecms.common.util; @H_403_0@
@H_403_0@ import java.lang.reflect.Field; @H_403_0@ import java.net.URL; @H_403_0@ import java.text.SimpleDateFormat; @H_403_0@ import java.util.ArrayList; @H_403_0@ import java.util.HashMap; @H_403_0@ import java.util.List; @H_403_0@ import java.util.Map; @H_403_0@
@H_403_0@ import org.dom4j.Document; @H_403_0@ import org.dom4j.DocumentHelper; @H_403_0@ import org.dom4j.Element; @H_403_0@ import org.dom4j.io.SAXReader; @H_403_0@
@H_403_0@ public class XmlParseUtil { @H_403_0@ /** @H_403_0@ * 反射设置实体不同类型字段的值 <暂时只支持 日期 字符串 boolean Integer值设置 待扩建> @H_403_0@ * @H_403_0@ * @param field @H_403_0@ * @param obj @H_403_0@ * @param value @H_403_0@ * @throws Exception @H_403_0@ */ @H_403_0@ public static void convertValue(Field field,Object obj,String value) @H_403_0@ throws Exception { @H_403_0@ SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @H_403_0@ if (field.getGenericType().toString().equals("class java.lang.Integer")) { @H_403_0@ field.set(obj,Integer.parseInt(value)); @H_403_0@ } else if (field.getGenericType().toString().equals("boolean")) { @H_403_0@ field.set(obj,Boolean.parseBoolean(value)); @H_403_0@ } else if (field.getGenericType().toString().equals( @H_403_0@ "class java.util.Date")) { @H_403_0@ field.set(obj,sim.parse(value)); @H_403_0@ } else { @H_403_0@ field.set(obj,value); @H_403_0@ } @H_403_0@
@H_403_0@ } @H_403_0@
@H_403_0@ /** @H_403_0@ * 解析xml文件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null @H_403_0@ * @H_403_0@ * @param xml @H_403_0@ * @param cls @H_403_0@ * @return @H_403_0@ * @throws Exception @H_403_0@ */ @H_403_0@ @SuppressWarnings("unchecked") @H_403_0@ public static List<?> parseXml2List(String xml,Class<?> cls) @H_403_0@ throws Exception { @H_403_0@ List<Object> lists = null; @H_403_0@ Document doc = DocumentHelper.parseText(xml); @H_403_0@ Element et = doc.getRootElement(); @H_403_0@ String root = et.getName(); @H_403_0@ // 查看返回码是否为真. @H_403_0@ List<Element> list = doc.selectNodes("//" + root + "/resultCode"); @H_403_0@ if (!list.isEmpty() && list.size() > 0) { @H_403_0@ Element element = list.get(0); @H_403_0@ String returnResult = element.getText(); @H_403_0@ if (returnResult.equals("0")) { @H_403_0@ List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s"); @H_403_0@ //判断对象父节点是否有包含数据 @H_403_0@ if(father!=null&&!father.isEmpty()&&father.size()==1){ @H_403_0@ List<Element> userLists = father.get(0).elements(); @H_403_0@ if (userLists!=null&&!list.isEmpty()) { @H_403_0@ lists = new ArrayList<Object>(); @H_403_0@ for (Element e : userLists) { @H_403_0@ List<Element> li = e.elements(); @H_403_0@ Class<?> cl = (Class<?>) Class.forName(cls.getName()); @H_403_0@ Object ob = cl.newInstance(); @H_403_0@ for (Element element2 : li) { @H_403_0@ String name = element2.getName(); @H_403_0@ String value = element2.getText(); @H_403_0@ Field field = ob.getClass().getDeclaredField(name); @H_403_0@ field.setAccessible(true); @H_403_0@ convertValue(field,ob,value); @H_403_0@ } @H_403_0@ lists.add(ob); @H_403_0@ } @H_403_0@ } @H_403_0@ } @H_403_0@ } @H_403_0@
@H_403_0@ } @H_403_0@ return lists; @H_403_0@ } @H_403_0@
@H_403_0@ /** @H_403_0@ * 解析xml文件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null @H_403_0@ * @H_403_0@ * @param url @H_403_0@ * @param cls @H_403_0@ * @return @H_403_0@ * @throws Exception @H_403_0@ */ @H_403_0@ @SuppressWarnings("unchecked") @H_403_0@ public static List<?> parseXml2List(URL url,Class<?> cls) @H_403_0@ throws Exception { @H_403_0@ List<Object> lists = null; @H_403_0@ SAXReader saxReader = new SAXReader(); @H_403_0@ Document doc = saxReader.read(url); @H_403_0@ Element et = doc.getRootElement(); @H_403_0@ String root = et.getName(); @H_403_0@ // 查看返回码是否为真. @H_403_0@ List<Element> list = doc.selectNodes("//" + root + "/resultCode"); @H_403_0@ if (!list.isEmpty() && list.size() > 0) { @H_403_0@ Element element = list.get(0); @H_403_0@ String returnResult = element.getText(); @H_403_0@ if (returnResult.equals("0")) { @H_403_0@ List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s"); @H_403_0@ //判断对象父节点是否有包含数据 @H_403_0@ if(father!=null&&!father.isEmpty()&&father.size()==1){ @H_403_0@ List<Element> userLists = father.get(0).elements(); @H_403_0@ if (userLists!=null&&!list.isEmpty()) { @H_403_0@ lists = new ArrayList<Object>(); @H_403_0@ for (Element e : userLists) { @H_403_0@ List<Element> li = e.elements(); @H_403_0@ Class<?> cl = (Class<?>) Class.forName(cls.getName()); @H_403_0@ Object ob = cl.newInstance(); @H_403_0@ for (Element element2 : li) { @H_403_0@ String name = element2.getName(); @H_403_0@ String value = element2.getText(); @H_403_0@ Field field = ob.getClass().getDeclaredField(name); @H_403_0@ field.setAccessible(true); @H_403_0@ convertValue(field,value); @H_403_0@ } @H_403_0@ lists.add(ob); @H_403_0@ } @H_403_0@ } @H_403_0@ } @H_403_0@ } @H_403_0@
@H_403_0@ } @H_403_0@ return lists; @H_403_0@ } @H_403_0@ @H_403_0@ /** @H_403_0@ * 解析xml文件返回保存Map的集合,map中可能包含key值为returnCode、desc、totalCount等单字段. @H_403_0@ * 也可能包含存储对象为List<cls>的集合值. @H_403_0@ * 获取List值key cls_List @H_403_0@ * @param requestPath @H_403_0@ * @param cls @H_403_0@ * @return map @H_403_0@ * @throws Exception @H_403_0@ */ @H_403_0@ @SuppressWarnings("unchecked") @H_403_0@ public static Map<String,Object> parseXml2Map(String requestPath, @H_403_0@ Class<?> cls) throws Exception { @H_403_0@ Map<String,Object> maps = new HashMap<String,Object>(); @H_403_0@ List<Object> lists = new ArrayList<Object>(); @H_403_0@ SAXReader saxReader = new SAXReader(); @H_403_0@ //Document doc = saxReader.read(new File(requestPath)); @H_403_0@ Document doc = saxReader.read(new URL(requestPath)); @H_403_0@ Element et = doc.getRootElement(); @H_403_0@ // 标记List是否为空 @H_403_0@ // boolean bool = true ; @H_403_0@ // 根节点名字 @H_403_0@ List<Element> rList = et.elements(); @H_403_0@ for (Element element : rList) { @H_403_0@ List<Element> rLists = element.elements(); @H_403_0@ if (!rLists.isEmpty() && rLists.size() > 0) { @H_403_0@ //bool = false; @H_403_0@ // 判断二级节点 @H_403_0@ for (Element e : rLists) { @H_403_0@ List<Element> li = e.elements(); @H_403_0@ Class<?> cl = (Class<?>) Class.forName(cls.getName()); @H_403_0@ Object ob = cl.newInstance(); @H_403_0@ for (Element element2 : li) { @H_403_0@ String name = element2.getName(); @H_403_0@ String value = element2.getText(); @H_403_0@ Field field = ob.getClass().getDeclaredField(name); @H_403_0@ field.setAccessible(true); @H_403_0@ convertValue(field,value); @H_403_0@ } @H_403_0@ lists.add(ob); @H_403_0@ } @H_403_0@ } else { @H_403_0@ maps.put(element.getName(),element.getText()); @H_403_0@ } @H_403_0@ maps.put(cls.getSimpleName() + "_List",lists); @H_403_0@ } @H_403_0@ return maps; @H_403_0@ } @H_403_0@
@H_403_0@ /** @H_403_0@ * 只获取返回码0为保存成功(true)1为保存失败(false) @H_403_0@ */ @H_403_0@ @SuppressWarnings("unchecked") @H_403_0@ public static boolean parseXmlReturnCode(String xml) { @H_403_0@ boolean bool = false; @H_403_0@ try { @H_403_0@ Document doc = DocumentHelper.parseText(xml); @H_403_0@ Element et = doc.getRootElement(); @H_403_0@ String root = et.getName(); @H_403_0@ // 查看返回码是否为真. @H_403_0@ List<Element> list = doc.selectNodes("//" + root + "/resultCode"); @H_403_0@ if (!list.isEmpty() && list.size() > 0) { @H_403_0@ Element element = list.get(0); @H_403_0@ String returnResult = element.getText(); @H_403_0@ if (returnResult.equals("0")) { @H_403_0@ bool = true; @H_403_0@ } @H_403_0@ } @H_403_0@ } catch (Exception e) { @H_403_0@ e.printStackTrace(); @H_403_0@ } @H_403_0@ return bool; @H_403_0@ } @H_403_0@ } @H_403_0@ //////////////////// 很多朋友遇到xml,map和json互转的问题,在开发中xml和json越来越重要了。我就把我的工具类贴上来。


@H_403_0@ @H_403_0@ @H_403_0@ [java] view plain copy print ?
  1. package com.shine.framework.core.util;
  2. import java.io.ByteArrayOutputStream;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map;
  8. import net.sf.json.JSON;
  9. import net.sf.json.JSONSerializer;
  10. import net.sf.json.xml.XMLSerializer;
  11. import org.dom4j.Document;
  12. import org.dom4j.DocumentHelper;
  13. import org.dom4j.Element;
  14. import org.dom4j.io.OutputFormat;
  15. import org.dom4j.io.XMLWriter;
  16. /**
  17. * common xml conver utility
  18. *
  19. * @author viruscodecn@gmail.com
  20. * @version Framework 2010.10.26
  21. * @url http://blog.csdn.net/arjick/article/details/6251777
  22. */
  23. public class XmlConverUtil {
  24. /**
  25. * map to xml xml <node><key label="key1">value1</key><key
  26. * label="key2">value2</key>......</node>
  27. *
  28. * @param map
  29. * @return
  30. */
  31. public static String maptoXml(Map map) {
  32. Document document = DocumentHelper.createDocument();
  33. Element nodeElement = document.addElement("node");
  34. for (Object obj : map.keySet()) {
  35. Element keyElement = nodeElement.addElement("key");
  36. keyElement.addAttribute("label",String.valueOf(obj));
  37. keyElement.setText(String.valueOf(map.get(obj)));
  38. }
  39. return doc2String(document);
  40. }
  41. /**
  42. * list to xml xml <nodes><node><key label="key1">value1</key><key
  43. * label="key2">value2</key>......</node><node><key
  44. * label="key1">value1</key><key
  45. * label="key2">value2</key>......</node></nodes>
  46. *
  47. * @param list
  48. * @return
  49. */
  50. public static String listtoXml(List list) throws Exception {
  51. Document document = DocumentHelper.createDocument();
  52. Element nodesElement = document.addElement("nodes");
  53. int i = 0;
  54. for (Object o : list) {
  55. Element nodeElement = nodesElement.addElement("node");
  56. if (o instanceof Map) {
  57. for (Object obj : ((Map) o).keySet()) {
  58. Element keyElement = nodeElement.addElement("key");
  59. keyElement.addAttribute("label",String.valueOf(obj));
  60. keyElement.setText(String.valueOf(((Map) o).get(obj)));
  61. }
  62. } else {
  63. Element keyElement = nodeElement.addElement("key");
  64. keyElement.addAttribute("label",String.valueOf(i));
  65. keyElement.setText(String.valueOf(o));
  66. }
  67. i++;
  68. }
  69. return doc2String(document);
  70. }
  71. /**
  72. * json to xml {"node":{"key":{"@label":"key1","#text":"value1"}}} conver
  73. * <o><node class="object"><key class="object"
  74. * label="key1">value1</key></node></o>
  75. *
  76. * @param json
  77. * @return
  78. */
  79. public static String jsontoXml(String json) {
  80. try {
  81. XMLSerializer serializer = new XMLSerializer();
  82. JSON jsonObject = JSONSerializer.toJSON(json);
  83. return serializer.write(jsonObject);
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. }
  87. return null;
  88. }
  89. /**
  90. * xml to map xml <node><key label="key1">value1</key><key
  91. * label="key2">value2</key>......</node>
  92. *
  93. * @param xml
  94. * @return
  95. */
  96. public static Map xmltoMap(String xml) {
  97. try {
  98. Map map = new HashMap();
  99. Document document = DocumentHelper.parseText(xml);
  100. Element nodeElement = document.getRootElement();
  101. List node = nodeElement.elements();
  102. for (Iterator it = node.iterator(); it.hasNext();) {
  103. Element elm = (Element) it.next();
  104. map.put(elm.attributeValue("label"),elm.getText());
  105. elm = null;
  106. }
  107. node = null;
  108. nodeElement = null;
  109. document = null;
  110. return map;
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. return null;
  115. }
  116. /**
  117. * xml to list xml <nodes><node><key label="key1">value1</key><key
  118. * label="key2">value2</key>......</node><node><key
  119. * label="key1">value1</key><key
  120. * label="key2">value2</key>......</node></nodes>
  121. *
  122. * @param xml
  123. * @return
  124. */
  125. public static List xmltoList(String xml) {
  126. try {
  127. List<Map> list = new ArrayList<Map>();
  128. Document document = DocumentHelper.parseText(xml);
  129. Element nodesElement = document.getRootElement();
  130. List nodes = nodesElement.elements();
  131. for (Iterator its = nodes.iterator(); its.hasNext();) {
  132. Element nodeElement = (Element) its.next();
  133. Map map = xmltoMap(nodeElement.asXML());
  134. list.add(map);
  135. map = null;
  136. }
  137. nodes = null;
  138. nodesElement = null;
  139. document = null;
  140. return list;
  141. } catch (Exception e) {
  142. e.printStackTrace();
  143. }
  144. return null;
  145. }
  146. /**
  147. * xml to json <node><key label="key1">value1</key></node> 转化为
  148. * {"key":{"@label":"key1","#text":"value1"}}
  149. *
  150. * @param xml
  151. * @return
  152. */
  153. public static String xmltoJson(String xml) {
  154. XMLSerializer xmlSerializer = new XMLSerializer();
  155. return xmlSerializer.read(xml).toString();
  156. }
  157. /**
  158. *
  159. * @param document
  160. * @return
  161. */
  162. public static String doc2String(Document document) {
  163. String s = "";
  164. try {
  165. // 使用输出流来进行转化
  166. ByteArrayOutputStream out = new ByteArrayOutputStream();
  167. // 使用UTF-8编码
  168. OutputFormat format = new OutputFormat(" ",true,"UTF-8");
  169. XMLWriter writer = new XMLWriter(out,format);
  170. writer.write(document);
  171. s = out.toString("UTF-8");
  172. } catch (Exception ex) {
  173. ex.printStackTrace();
  174. }
  175. return s;
  176. }
  177. }
@H_403_0@ //////////////

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

示例:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
public class XmlUtils {
@SuppressWarnings("unchecked")
public static Map<String,Object> Dom2Map(Document doc){
Map<String,Object> map = new HashMap<String,Object>();
if(doc == null)
return map;
Element root = doc.getRootElement();
for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {
Element e = (Element) iterator.next();
List list = e.elements();
if(list.size() > 0){
map.put(e.getName(),Dom2Map(e));
}else
map.put(e.getName(),e.getText());
}
return map;
}
@SuppressWarnings("unchecked")
public static Map Dom2Map(Element e){
Map map = new HashMap();
List list = e.elements();
if(list.size() > 0){
for (int i = 0;i < list.size(); i++) {
Element iter = (Element) list.get(i);
List mapList = new ArrayList();

if(iter.elements().size() > 0){
Map m = Dom2Map(iter);
if(map.get(iter.getName()) != null){
Object obj = map.get(iter.getName());
if(!obj.getClass().getName().equals("java.util.ArrayList")){
mapList = new ArrayList();
mapList.add(obj);
mapList.add(m);
}
if(obj.getClass().getName().equals("java.util.ArrayList")){
mapList = (List) obj;
mapList.add(m);
}
map.put(iter.getName(),mapList);
}else
map.put(iter.getName(),m);
}
else{
if(map.get(iter.getName()) != null){
Object obj = map.get(iter.getName());
if(!obj.getClass().getName().equals("java.util.ArrayList")){
mapList = new ArrayList();
mapList.add(obj);
mapList.add(iter.getText());
}
if(obj.getClass().getName().equals("java.util.ArrayList")){
mapList = (List) obj;
mapList.add(iter.getText());
}
map.put(iter.getName(),iter.getText());
}
}
}else
map.put(e.getName(),e.getText());
return map;
}
}
测试类:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;

public class XmlToMapDemo {
public static void main(String[] args) throws IOException,
DocumentException {

FileInputStream fis = new FileInputStream("d://a.xml");
byte[] b = new byte[fis.available()];
fis.read(b);
String str = new String(b);

Document doc = DocumentHelper.parseText(str);

System.out.println(doc.asXML());

long beginTime = System.currentTimeMillis();

Map<String,Object> map = XmlUtils.Dom2Map(doc);

System.out.println(map.toString());

System.out.println("Use time:"+(System.currentTimeMillis()-beginTime));

} }

猜你在找的XML相关文章