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(); } } }
这里Book对象属性都是String,如果Book对象的属性类型不一样,还是要做判断
这个文件有点长哟