关于遍历获取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

https://img.mukewang.com/climg/64048b9f09bb8f9708720461.jpg

0

好帮手慕小脸

2022-12-10

同学你好,

1、document.getRootElement()得到根节点,然后在根节点下用selectNodes(),selectNodes是按照指定的Xpath表达式来得到节点的集合。直接传入bean就会将当前根节点下所有bean子标签获取了。返回的是一个List集合,集合中每个对象都是一个Node节点。

使用elements方法获取beans元素下边的所有子元素bean,多个bean元素存储在一个List集合

2、结合具体业务情况去使用即可~没有强制要求哪个使用的多或少

祝学习愉快~


0

0 学习 · 9886 问题

查看课程