SAXBuilder解析

SAXBuilder是什么?
SAXBuilder是一个JDOM解析器,能够将路径中xml文件解析到Document对象

例:
	SAXBuilder builder = new SAXBuilder();
	Document doc = builder.build(path);

使用SAXBuilder的优缺点
优点:对内存消耗小,适用于只处理xml文件
缺点:不易编程(需要借助handler来进行解析)and 很难同时访问一个xml中的多处不同数据(事件有先后顺序)

SAXBuilder解析xml实例

beans.xml文件
在这里插入图片描述

解析xml的类

package com.ss.service;
    
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
    
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
    
import com.ss.dao.BookDaoImpl;
import com.ss.simulation.ApplicationContext;
    
public class ClassPathXmlApplicationContext implements ApplicationContext {

	private Map<String, Object> container = new HashMap<String, Object>();

	public Map<String, Object> getContainer() {
		return container;
	}

	public void setContainer(Map<String, Object> container) {
		this.container = container;
	}

	@Override
	public Object getBean(String id) {
		return container.get(id);
	}

	// 构造器
	public ClassPathXmlApplicationContext(String path) {
		// 创建SAXBuilder解析器
		SAXBuilder builder = new SAXBuilder();
		Document document = null;
		
		try {
			// 得到Document,之后的操作都是对它进行操作    build(path):加载XML文件
			document = builder.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(path));
			// 获取根节点
			Element root = document.getRootElement();
			// 获取根节点下面名为“bean”的子节点
			List<Element> children = root.getChildren("bean");

			for (Element child : children) {
				String key = child.getAttributeValue("id");
				String classValue = child.getAttributeValue("class");
				// Class.forName():返回一个类     newInstance():获取实例
				Object value = Class.forName(classValue).newInstance();
				System.out.println("key:"+key+"   classValue:"+classValue);
				container.put(key, value);
			}

			for (Element child : children) {
				Object obj = container.get(child.getAttributeValue("id"));
				List<Element> properties = child.getChildren("property"); // 得到子节点下面名为“property”的子节点

				// 处理property标签,对应对象时被注入的对象
				for (Element property : properties) {
					String ref = property.getAttributeValue("ref"); // 获取property标签里ref属性
					String setStr = "";
					Object value = null;
					Method setter = null;

					if (null != ref) {
						setStr = "set".concat(ref.substring(0, 1).toUpperCase()).concat(ref.substring(1));
						System.out.println("set:"+setStr);
						value = container.get(ref);
						System.out.println("key:"+value);
						setter = obj.getClass().getMethod(setStr, value.getClass().getInterfaces()[0]);
						setter.invoke(obj, value);
					} else {
						String name = property.getAttributeValue("name");
						String v = property.getAttributeValue("value");
						setStr = "set".concat(name.substring(0, 1).toUpperCase()).concat(name.substring(1));
						System.out.println("name:   "+name+"     setStr:   "+setStr);
						Field field = obj.getClass().getDeclaredField(name);
						Type type = field.getGenericType();
						System.out.println("type.toString:    " + type.toString());
						if (type.toString().endsWith("Integer")) {  // 判断后面是否以指定参数结束
							setter = obj.getClass().getDeclaredMethod(setStr, Integer.class);
							Integer va = Integer.parseInt(v);
							setter.invoke(obj, va);
						} else if (type.toString().endsWith("String")) {
							setter = obj.getClass().getDeclaredMethod(setStr, String.class);
							setter.invoke(obj, v);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new  ClassPathXmlApplicationContext("beans.xml");
		BookDaoImpl bean = (BookDaoImpl)context.getBean("bookDao");
		System.out.println(bean);
	}
	
	
}

实体类

 package com.ss.dao;
    
 public class BookDaoImpl implements BookDao {

	private String name;
	private Integer age;
	public BookDaoImpl(String name, Integer age) {
		this.name = name;
		this.age = age;
	}
	public BookDaoImpl() {
	}
	@Override
	public String toString() {
		return "BookDaoImpl [name=" + name + ", age=" + age + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
}

控制台
在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值