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]

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

原文地址:https://www.cnblogs.com/xiaozhaoboke/p/11037242.html