可以通过反射实现

来源:4-5 在 JDOM 中存储 Book 对象

慕的地9539986

2019-06-28 16:52

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();
		}
	}
}


写回答 关注

2回答

  • moocYhz
    2021-11-27 18:53:38

    这里Book对象属性都是String,如果Book对象的属性类型不一样,还是要做判断

  • 慕梦前来
    2021-08-18 22:32:18

    这个文件有点长哟

Java眼中的XML---文件读取

通过Java认识并且创造XML文件,如何应用 Java“解析 XML

83199 学习 · 431 问题

查看课程

相似问题