关于遍历获取XML文件内容的方法
来源:4-5 实现极简IoC容器
慕尼黑3413982
2022-12-09 20:52:15
老师,我试了一下如下两种方法都是可以正确实现视频中的效果,请问两种方法有和区别,实际工作中哪个用的比较多?
package com.imooc.spring.ioc.context;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//IoC容器,用于存储对象
public class ClassPathXmlApplicationContext implements ApplicationContext {
private Map<String, Object> iocContainer = new HashMap();
public ClassPathXmlApplicationContext() {
try {
SAXReader reader = new SAXReader();
InputStream inputStream = this.getClass().getResourceAsStream("/applicationContext.xml");
Document document = reader.read(inputStream);
/**
* 获取所有根标签下面的bean标签
* <beans>
* <bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
* <property name="title" value="红富士"/>
* <property name="color" value="红色"/>
* <property name="origin" value="欧洲"/>
* </bean>
* <bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
* <property name="title" value="红富士"/>
* <property name="color" value="红色"/>
* <property name="origin" value="欧洲"/>
* </bean>
* </beans>
*/
List<Node> beans = document.getRootElement().selectNodes("bean");
for (Node node : beans) {
Element element = (Element) node;
/**
* 读取当前节点对应的属性
* <bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
* </bean>
*/
String beanId = element.attributeValue("id");
String className = element.attributeValue("class");
// System.out.println(beanId);
// System.out.println(className);
//反射
// 阶段二/第11周/Java反射
// https://class.imooc.com/course/2086
Class<?> c = Class.forName(className);
Object obj = c.newInstance();
// System.out.println(obj);
List<Node> properties = element.selectNodes("property");
for (Node p : properties) {
Element property = (Element) p;
//title
String propName = property.attributeValue("name");
String propValue = property.attributeValue("value");
// System.out.println(propName + " " + propValue);
//setTitle
String setMethodName = "set" + propName.substring(0, 1).toUpperCase() + propName.substring(1);
System.out.println("准备执行" + setMethodName + "方法注入数据");
//反射
Method method = c.getMethod(setMethodName, String.class);
method.invoke(obj, propValue);//通过setter方法注入数据
}
iocContainer.put(beanId, obj);
}
System.out.println(iocContainer);
System.out.println("IOC容器初始化完毕");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object getBean(String beanId) {
return iocContainer.get(beanId);
}
}
package com.imooc.spring.ioc.context;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//IoC容器,用于存储对象
public class ClassPathXmlApplicationContext1 implements ApplicationContext {
private Map<String, Object> iocContainer = new HashMap();
public ClassPathXmlApplicationContext1() {
try {
SAXReader reader = new SAXReader();
InputStream inputStream = this.getClass().getResourceAsStream("/applicationContext.xml");
Document document = reader.read(inputStream);
/**
* 获取所有根标签下面的bean标签
* <beans>
* <bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
* <property name="title" value="红富士"/>
* <property name="color" value="红色"/>
* <property name="origin" value="欧洲"/>
* </bean>
* <bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
* <property name="title" value="红富士"/>
* <property name="color" value="红色"/>
* <property name="origin" value="欧洲"/>
* </bean>
* </beans>
*/
List<Element> beans = document.getRootElement().elements("bean");
for (Element element : beans) {
String id = element.attributeValue("id");
String className = element.attributeValue("class");
// System.out.println(id);
// System.out.println(className);
Class<?> c = Class.forName(className);
Object o = c.newInstance();
// System.out.println(o);
List<Element> properties = element.elements("property");
for (Element p : properties) {
String propName = p.attributeValue("name");
String propValue = p.attributeValue("value");
// System.out.println(propName);//title
// System.out.println(propValue);
String setMethodName = "set" + propName.substring(0, 1).toUpperCase() + propName.substring(1);//setTitle
Method method = c.getMethod(setMethodName, String.class);
method.invoke(o, propValue);
}
iocContainer.put(id, o);
}
System.out.println(iocContainer);
System.out.println("IOC容器初始化完毕");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object getBean(String beanId) {
return iocContainer.get(beanId);
}
}
2回答
只能卷了
2023-03-05
好帮手慕小脸
2022-12-10
同学你好,
1、document.getRootElement()得到根节点,然后在根节点下用selectNodes(),selectNodes是按照指定的Xpath表达式来得到节点的集合。直接传入bean就会将当前根节点下所有bean子标签获取了。返回的是一个List集合,集合中每个对象都是一个Node节点。
使用elements方法获取beans元素下边的所有子元素bean,多个bean元素存储在一个List集合
2、结合具体业务情况去使用即可~没有强制要求哪个使用的多或少
祝学习愉快~
相似问题