package jdomTest;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
public class ReflectXmlMethod {
static ArrayList<Book>list=new ArrayList<Book>();
public static void main(String[] args) {
// 进行对books.xml文件的JDOM解析
// 准备工作
// 创建一个输入流,将xml文件加载到输入流里面来
InputStream in;
try {
in = new FileInputStream("books.xml");
// 通过sb方法将输入流加载到saxBuilder中
SAXBuilder sb = new SAXBuilder();
Document d = sb.build(in);
// 通过document对象获取xml文件的根节点
Element e = d.getRootElement();
// 获取子节点
List<Element> childlist = e.getChildren();
for (Element ele : childlist) {
Book book=new Book();
System.out.println("=======开始解析第" + (childlist.indexOf(ele) + 1) + "本书=========");
// 解析book的属性集合
List<Attribute>attrslist = ele.getAttributes();
// 知道节点下属性名称数,获取节点值
// ele.getAttributeValue("id");
// System.out.println(child2list.size());
for (Attribute attrs : attrslist) {
// 获取属性名和属性值,并输出
System.out.println("属性名:" + attrs.getName() + "---属性值:" + attrs.getValue());
if(attrs.getName().equals("id")) {
book.setId(attrs.getValue());
}
}
// 遍历book节点的子节点的节点名已经节点值
List<Element>child2list = ele.getChildren();
for (Element element : child2list) {
System.out.println("节点名:" + element.getName() + "---节点值:" + element.getValue());
// if(element.getName().equals("name")) {
// book.setName(element.getValue());
// }else if(element.getName().equals("author")) {
// book.setAuthor(element.getValue());
// }else if(element.getName().equals("year")) {
// book.setYear(element.getValue());
// }else if(element.getName().equals("price")) {
// book.setPrice(element.getValue());
// }else if(element.getName().equals("language")) {
// book.setLanguage(element.getValue());
// }
//通过反射以及字符拼接实现传值
Class c=book.getClass();
Field f=c.getDeclaredField(element.getName());
StringBuilder sb1=new StringBuilder();
// sb1.append("set").append(f.getName().substring(0, 1).toUpperCase()).append(f.getName().substring(1));
String s="set"+f.getName().substring(0, 1).toUpperCase()+f.getName().substring(1);
//System.out.println(sb1);
Method m=c.getMethod(s, String.class);
m.invoke(book, element.getValue());
}
System.out.println("==========结束解析第" + (childlist.indexOf(ele) + 1) + "本书===========");
System.out.println();
list.add(book);
book=null;
}
//这里在book类中重写下toString()方法
for(Book array:list) {
System.out.println(array.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}