SAXBuilder解析
2018-11-11 18:01
106 查看
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) { // toUpperCase():把所有字母转换成大写 toLowerCase():把所有字母转换成小写 // substring(x):从x下标开始截取字符 // substring(x, y):从x下标开始截取到y下标结束,包含x下标的字符,不包含y下标的字符,左臂右开 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); // getInterfaces()[0]:获得对象所实现的第一个接口 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); // field.setAccessible(true); // getGenericType():如果当前属性有签名属性就返回,否则就返回 field.getType() // getType():返回一个class对象 class java.lang.Integer 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; } }
控制台
相关文章推荐
- SAXBuilder解析xml文件内容用于公共参数的校验
- SAXBuilder解析applicationConfig.config配置文件
- SAXBuilder解析xml文件
- python 解析xml 文件: SAX方式
- 详解android解析Xml的三种方式——DOM、SAX以及XMLpull
- (转)Android中解析XML:SAX、DOM、PULL
- XML解析之DOM详解及与SAX解析方法的比较
- Sax 解析: 获取goole weather
- Java 中使用 SAX 解析 XML 文档
- dom4j-dom-sax解析
- 用SAX解析XML
- SAX解析XML 详解
- SAX方式解析xml
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- Android解析Xml的三种方式:DOM、SAX以及XMLPull
- Android 解析XML之二 SAX
- XML----SAX解析XML文件
- xml基础--解析(SAX)
- 解析XML(三种解析方式DOM,SAX,PULL)
- java SAX解析XML文件