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]
学习后总结,不足之处,后续修改!