泛型方法解析XML并返回列表

昨天学习了使用Dom4j对XML进行解析,在练习过程中,实现了泛型方法解析XML并返回List 的功能.

实现思路:

  1. 调用方法时传入Class对象和要解析的XML的url
  2. Dom4j将文档解析出来加载到内存
  3. 遍历文档,按照文档的标签名获取对应的set方法
  4. 将标签内的文本值通过set方法set进JavaBean对象
  5. 将JavaBean添加到list

代码如下:

规范:1)XML文件的每个子元素的根节点要有一个ID属性

1
2
3
4
5
<book id="101">
<name>Thinking in Java</name>
<price>88.70</price>
<author>Bruce Eckel</author>
</book>

2)XML里元素的名字与JavaBean里的属性名一致

parseXML():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static <T> ArrayList<T> parseXML(Class c, String url) throws Exception {
ArrayList<T> list = new ArrayList<T>();
SAXReader reader = new SAXReader();
Document doc = reader.read(url);
Element root = doc.getRootElement();
// 这里原来使用了XML文件的节点名来获取类,麻烦而且不灵活
// 在参数列表加了一个Class的参数后,解决了这个问题
// String clsName = ((Element) root.elements().get(0)).getName();
// Class clazz = Class.forName("com.wasea.pojo." + clsName);

for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
Element e = it.next();
Object o = c.newInstance();
// 此处规定XML的元素节点要有一个id属性
getSetMethod(c, "id").invoke(o, e.attributeValue("id"));
// 再遍历节点的子元素们, 将文本值设进去
for (Iterator<Element> it1 = e.elementIterator(); it1.hasNext();) {
Element e1 = it1.next();
getSetMethod(c, e1.getName()).invoke(o, e1.getText());
}
list.add((T) o);
}

return list;
}

getSetMethod():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static Method getSetMethod(Class obClass, String fName) throws Exception {
// 这里暂时不用数组,在下边写死返回的为fieldType,因为set方法通常只有一个参数
/*
* Class[] paramaterTypes = new Class[1]; Field field =
* obClass.getDeclaredField(fName); paramaterTypes[0] = field.getType();
*/

StringBuffer sb = new StringBuffer();
// 通过拼接字符串拼出set方法!
sb.append("set");
sb.append(fName.substring(0, 1).toUpperCase());
sb.append(fName.substring(1));
// 通过Class对象+方法名+参数类型得到对应的set方法
return obClass.getMethod(sb.toString(), obClass.getDeclaredField(fName).getType());
}