zoukankan      html  css  js  c++  java
  • XML 文件解析

    Dom4j是目前最流行、最好用的XML解析工具,解析XML的速度最快

    一、环境准备:Maven导入dom4j依赖

    <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>

    二、解析单个学生的XML方法(一)

    1.提供XML文件

    <?xml version="1.0" encoding="UTF-8"?>
    <student studentNO="1804">
        <name>Tom</name>
        <age>18</age>
        <gender></gender>
        <phone>18888888888</phone>
    </student>

    2.新建Student类(属性和XML中的数据保持一致)

    package cn.xiaobing.pojo;
    
    public class Student {
        private String studentNO;
        private String name;
        private String age;
        private String gender;
        private String phone;
        public String getStudentNO() {
            return studentNO;
        }
        public void setStudentNO(String studentNO) {
            this.studentNO = studentNO;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        public Student(String studentNO, String name, String age, String gender, String phone) {
            super();
            this.studentNO = studentNO;
            this.name = name;
            this.age = age;
            this.gender = gender;
            this.phone = phone;
        }
        public Student() {
            super();
        }
        @Override
        public String toString() {
            return "Student [studentNO=" + studentNO + ", name=" + name + ", age=" + age + ", gender=" + gender + ", phone="
                    + phone + "]";
        }
        
    }

    3.利用dom4j实现XML文件解析方法

    package cn.xiaobing.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    import cn.xiaobing.pojo.Student;
    
    public class XmlDemo {
        /**
         * 解析XML的方法,将解析得到的属性封装到对象
         */
        public static Student readXml1() {
            //1.创建解析器
            SAXReader saxReader = new SAXReader();
            //2.获取Document文档对象
            File file = new File("src/test/resources/student.xml");
            InputStream inputStream = null;
            Document document = null;
            try {
                inputStream = new FileInputStream(file);
                document = saxReader.read(inputStream);
                //3.获取根节点
                Element root = document.getRootElement();
                //新建一个学生类stu来保存数据
                Student stu = new Student();
                //获取根节点的属性值
                String sid = root.attributeValue("StudentNO");
                XMLUtil.reflectWriteStudent(stu, sid, "setStudentNO");
                //4.通过根节点一级一级遍历,拿到子节点的内容
                List<Element> elements = root.elements();
                for (int i = 0; i < elements.size(); i++) {
                    Element element = elements.get(i);
                    //获取文本值
                    String text = element.getText();
                    //获取标签名
                    String str = element.getName();
                    //准备student对象的set方法名,将传入的首字母大写
                    String setMethodName = "set"+XMLUtil.initialToUpperCase(str);
                    //拿到方法对象,利用反射机制,将text值写入对应的方法
                    XMLUtil.reflectWriteStudent(stu, text, setMethodName);
                }
                return stu;
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(inputStream!=null) {
                    try {
                        inputStream.close();//关闭输入流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }
        //main方法调用测试
        public static void main(String[] args) {
            Student stu = readXml1();
            System.out.println(stu);
        }
    }

    4.XMLUtil 工具类

    package cn.xiaobing.util;
    import java.lang.reflect.Method;
    import cn.xiaobing.pojo.Student;
    
    public class XMLUtil {
        /**
         * @param stu  传入student对象
         * @param text 传入写入对象的value值
         * @param setMethodName 传入写如对象的set方法名
         */
        public static void reflectWriteStudent(Student stu, String text, String setMethodName){
            //拿到方法对象,利用反射机制,将value值写入对应的方法
            Method method;
            try {
                method = Student.class.getMethod(setMethodName, String.class);
                method.invoke(stu, text);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**将传入的首字母大写
         * @param str
         * @return 首字母大写的字符串
         */
        public static String initialToUpperCase(String str) {
            //将字符串首字母转为大写
            str = str.substring(0, 1).toUpperCase() + str.substring(1);
            return str;
        }
    
    }

    5.控制台输出

    Student [studentNO=1804, name=Tom, age=18, gender=男, phone=18888888888]

    三、解析多个学生的XML方法(二)

    1.提供XML文件

    <?xml version="1.0" encoding="UTF-8"?>
    <students grade="一年级" >
        <student studentNO="1801">
            <name>Tom</name>
            <age>18</age>
            <gender></gender>
            <phone>18888888888</phone>
        </student>
        <student studentNO="1802">
            <name>Miss Li</name>
            <age>19</age>
            <gender></gender>
            <phone>19999999999</phone>
        </student>
            <student studentNO="1802">
            <name>John</name>
            <age>20</age>
            <gender></gender>
            <phone>12020202020</phone>
        </student>
    </students>

    2.XMLUtil工具类如上

    3.XML解析代码实现(二)

    package cn.xiaobing.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    import cn.xiaobing.pojo.Student;
    
    public class XmlDemo2 {
        /**
         * 解析XML的方法,将解析得到的属性封装到List<Students>
         */
        public static List<Student> readXml2() {
            List<Student> stuList = new ArrayList<Student>();
            //1.创建解析器
            SAXReader saxReader = new SAXReader();
            //2.获取Document文档对象
            File file = new File("src/test/resources/students.xml");
            InputStream inputStream = null;
            Document document = null;
            try {
                inputStream = new FileInputStream(file);
                document = saxReader.read(inputStream);
                //3.获取根节点
                Element root = document.getRootElement();
                //4.获取Student元素
                List<Element> studentElementList = root.elements();
                Student stu = null;
                //遍历所有的student元素
                for (int i = 0; i < studentElementList.size(); i++) {
                    stu =new Student();
                    //取出每一个student元素
                    Element studentElement = studentElementList.get(i);
                    //获取学生student的班级属性studentNO
                    String textStudentNO = studentElement.attributeValue("studentNO");
                    //反射调用set方法将studentNO属性值写入stu对象
                    XMLUtil.reflectWriteStudent(stu, textStudentNO, "setStudentNO");
                    List<Element> elements = studentElement.elements();
                    for (int j = 0; j < elements.size(); j++) {
                        Element element = elements.get(j);
                        //获取标签文本值
                        String text = element.getText();
                        //获取标签名
                        String str = element.getName();
                        //将传入的首字母大写
                        String setMethodName = "set"+XMLUtil.initialToUpperCase(str);
                        //拿到方法对象,利用反射机制,将value值写入对应的方法
                        XMLUtil.reflectWriteStudent(stu, text, setMethodName);
                    }
                    stuList.add(stu);
            }
            return stuList;
                
                
            }catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }
        //使用main方法调用函数,验证解析结果
        public static void main(String[] args) {
            List<Student> stuLst = readXml2();
            for (Student stu : stuLst) {
                System.out.println(stu);
            }
        }
    }

    4.控制台输出

    Student [studentNO=1801, name=Tom, age=18, gender=男, phone=18888888888]
    Student [studentNO=1802, name=Miss Li, age=19, gender=女, phone=19999999999]
    Student [studentNO=1803, name=John, age=20, gender=男, phone=12020202020]

    学习后总结,不足之处,后续修改!

  • 相关阅读:
    编写高质量代码建议17代码错误调试
    同步和异步的不同场景的概念理解
    kafka版本0.8.2.0-Producer Configs之request.required.acks
    linux的grep命令
    jetty服务器访问系统的域名
    linux工具问题,tail -f 失效
    memcached并发处理
    python爬虫scrapy的Selectors参考文档
    访问nginx提示gateway timeout 504 ,发现总是当调用时间超过30s时提示504错误
    重构再次理解
  • 原文地址:https://www.cnblogs.com/xiaozhaoboke/p/11037242.html
Copyright © 2011-2022 走看看