用Java实现XML读写
XML文件介绍
XML(EXtensible Markup Language)扩展性标记语言。由程序设计编写者自定义实现
XML主要用来以标记文本形式表示一组或多组数据,很多计算机语言都提供对XML文件的解析,使用XML格式传递数据可以实现跨平台跨计算机编程语言
XML是W3C组织强烈推荐的数据交换格式标准
XML语法规则
标准声明 <?xml version=”1.0” encoding=”UTF-8”?>
标签封闭 <p>This is a paragraph</p>
<Message>这是错误的</message> 大小写敏感
<root><child>.........</child></root>至少有一个根元素
XML的属性值必需加引号(“ ” 或 ‘ ’)
实体引用
< <小于
> >大于
& &和号
' ‘单引号
" “引号
XML中的注释
<!-- This is a comment-->
在XML中,空格会被保留
idea中默认没有XML File这个文件类型,如果想要新建XML文件,参考这个链接自定义XML模板https://blog.csdn.net/li1325169021/article/details/93158207
XML中的元素是用<元素名称>与</元素名称>定义在文档中的节点描述。
元素中可以包含其它子元素、元素属性及普通常量文本。
名称可以含字母、数字以及其他字符。
名称不能以数字或者标点符号开始
名称不能以字符“xml”(或者XML,Xml)开始
名称不能包含空格
XML元素属性
XML中属性是用来描述元素特征的,它必须由名称和值组成,之间用“=”符号实现赋值,属性值必须使用单引号或双引号包围
<user name=”东方不败” age=’35’></user>
特殊情况:
如果属性值本身包含双引号,那么有必要使用单引号包围它,就像这个
<gangster name=’George”Shotgun”Ziegler’>
或者可以使用实体引用:
<gangster name=”George"Shotgun"Ziegler”>
JDOM解析XML文件
- Jdom是由第三方提供和维护的一组标准的java实现,用来以java语言形式解析XML文档;因此它只适合Java平台语言,因此它只适合Java平台语言,Jdom不遵循任何DOM实现标准,它只和Java相关。
- Jdom对XML文档实现最为简单的读写操作,jdom将XML文档中的每个节点(node)称之为Element(元素),并提供对元素上下级元素的获取等实用方法。
- Jdom解析XML文件大体分类两种操作
(1) 读取目标XML文档并解析,封装成运行时的Java对象进行处理
(2) 将运行时Java对象以XML文件方式写入硬盘存储
JDOM读取XML文档
- 创建SAXBuilder用来构建加载目标XML文档
- 基于XML路径创建XML文件对象
- 使用SAXBuilder加载XML文件对象
- 利用JDOM相关方法解析XML文档封装为Java对象
idea默认不编译项目中的xml文件,需要在pom的build模块下添加如下代码
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
DOM4J解析XML文件
- dom4j是由第三方提供扩展子JDOMAPI的一组解析XML文件的java实现,它只和Java相关。
- dom4j对XML文档实现与JDOM类似,jdom将XML文档中的每个节点(node)称之为Element(元素),并提供对元素上下级元素的获取等实用方法。
- dom4j解析XML大体分类两种擦欧洲哦
(1) 读取目标XML文档并解析,封装成运行时的Java对象进行处理。
(2) 将运行时Java对象以XML文件方式写入硬盘存储。
DOM4J写入XML文档
- 创建DocumentFactory用来创建Document对象
- 使用DOM4J实现对Document对象操作
- 创建XMLWriter用来将Document对象写入XML文件
- 关闭相关文件流
DOM4J读取XML文档
- 基于xml文件路径创建File对象
- 创建SAXReader用来加载xml文件为Document
- 利用DOM4J相关方法解析XML文档
- 封装文档对象数据为Java对象
使用Jdom进行读写:
package com.xzit.util; import com.xzit.entity.Student; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.jdom2.output.XMLOutputter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * XML格式文档的解析功能类 */ public class JdomXMLManager { private static SAXBuilder saxBuilder; //用来构建xml文件 private static Document document; //XML文档对象 private static XMLOutputter xmlOutput; //保存更新xml文件 /** * 将xml文件进行读取并数据封装为Student对象,存储在List集合返回 * @return List 封装学生对象的集合链表 */ public static List<Student> toStudentsFromXML(String xmlFileName){ List<Student> stuList = new ArrayList<Student>(); newInstanceSAXBulider(); //调用方法 String classPath = Tools.getClassPath(); //调用获取类路径的方法 /* 基于类路径创建目标xml文件的java.io.File 对象 */ File xmlFile = new File(classPath+"com/xzit/doc/"+xmlFileName); try { //使用SAXBuilder构建目标xml文件得到一个Document对象 document = saxBuilder.build(xmlFile); if (document!=null){ //解析xml文档对象document Element root = document.getRootElement(); //获取xml文档对象document根节点 List<Element> studentList = root.getChildren(); //获取根元素下的一级子元素 for (Element e:studentList){ //循环遍历所有根元素下的student子元素并将其封装为Student学生对象 Student stuObj = new Student(); //获取当前元素的code属性对应的值 String code = e.getAttribute("code").getValue(); //获取当前元素的code属性对应的值 stuObj.setCode(code); //设置对象的code属性值 //获取当前元素的子元素 String name = e.getChild("name").getText(); stuObj.setName(name); String sex = e.getChild("sex").getText(); stuObj.setSex(sex); String address = e.getChild("address").getText(); stuObj.setAddress(address); String birth = e.getChild("birth").getText(); //将字符串转换为Date类型 Date birthDate = new SimpleDateFormat("yyyy-MM-dd").parse(birth); stuObj.setBirth(birthDate); stuList.add(stuObj); } } } catch (Exception e) { e.printStackTrace(); } return stuList; } /** * 此方法实现对目标xml的信息修改 * @param stu 修改的学生信息对象 * @param fileName xml文件名称 */ public static void modifyXML(Student stu,String fileName){ newInstanceSAXBulider(); //调用方法 String classPath = Tools.getClassPath(); File xmlFile = new File(classPath+"com/xzit/doc/"+fileName); newInstanceXMLOutputter(); // 实例化XMLOutputter Writer out = null; try { document = saxBuilder.build(xmlFile); //构建获取Document对象 Element root = document.getRootElement(); //获取根元素 List<Element> studentList = root.getChildren("student"); //获取所有一级节点student /* 循环遍历 */ for (Element e:studentList){ String codeVal = e.getAttribute("code").getValue(); //获取code属性值进行对比 /* 如果stu code 值与codeVal相同 */ if (stu.getCode().equals(codeVal)){ Element nameEle = e.getChild("name"); nameEle.setText(stu.getName()); //修改name子元素的文本 Element sexEle = e.getChild("sex"); sexEle.setText(stu.getSex()); //修改sex的文本 } } out = new FileWriter(xmlFile); //写入目标xml文件的输出流 xmlOutput.output(document,out); } catch (Exception e) { e.printStackTrace(); }finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 此方法用来创建一个SAXBuilder对象 */ private static void newInstanceSAXBulider(){ if (saxBuilder == null){ saxBuilder = new SAXBuilder(); } } /** * 此方法用来创建一个XMLOutput对象 */ private static void newInstanceXMLOutputter(){ if (xmlOutput == null) xmlOutput = new XMLOutputter(); } }
读取XML:
package com.xzit; import com.xzit.util.JdomXMLManager; import com.xzit.entity.Student; import java.text.SimpleDateFormat; import java.util.List; /** * Hello world! * */ public class TestJdomReaderXML { public static void main(String[] args) { String xmlFileName = "students.xml"; //目标被读取的xml文件名称 List<Student> students = JdomXMLManager.toStudentsFromXML(xmlFileName); //调用目标读取xml的方法 System.out.println("所有学生信息如下"); System.out.println("--------------------------------------------"); System.out.println("编号\t姓名\t生日\t性别\t住址"); System.out.println("--------------------------------------------"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); for (Student s:students){ System.out.println(s.getCode()+"\t"+s.getName() +"\t"+sdf.format(s.getBirth())+"\t"+s.getSex()+"\t"+s.getAddress()); System.out.println("--------------------------------------------"); } } }
写入XML:
package com.xzit; import com.xzit.entity.Student; import com.xzit.util.JdomXMLManager; import java.util.Scanner; public class TestJdomWriterXML { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("请输入要修改学生的编号"); String code = in.next(); System.out.println("请输入姓名"); String name = in.next(); System.out.println("请输入性别"); String sex = in.next(); Student temp = new Student(); temp.setCode(code); temp.setSex(sex); temp.setName(name); String fileName = "students.xml"; JdomXMLManager.modifyXML(temp,fileName); //调用目标修改方法实现xml文件数据修改 } }
工具类:
package com.xzit.util; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Calendar; import java.util.Date; public final class Tools { /** * 获取当前应用程序类路径的通用方法 * @return 类路径 */ public static String getClassPath(){ String path = Tools.class.getClassLoader().getResource("").getPath().toString(); try { path = URLDecoder.decode(path,"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return path; } /** * 构建Date对象的通用方法 * @param year 年 * @param month 月 * @param date 日 * @return */ public static Date toDate(int year,int month,int date){ Date dates = null; java.util.Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR,year); cal.set(Calendar.MONTH,month-1); cal.set(Calendar.DATE,date); dates = cal.getTime(); return dates; } }
学生类:
package com.xzit.entity; import java.util.Date; /** * 实体类,学生信息 */ public class Student { private String code; //学生编号 private String name; //姓名 private Date birth; private String sex; private String address; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
-------------------------------------------------------------------------------------------------------------------------
使用Dom4j进行XML读写:
package com.xzit.util; import com.xzit.entity.Employee; import org.dom4j.Document; import org.dom4j.DocumentFactory; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; public class Dom4jXMLManager { private static final DocumentFactory docFactory = DocumentFactory.getInstance(); public static void toXMLFromEmployee(List<Employee> empList,String fileName){ Document doc = docFactory.createDocument("utf-8"); //创建Document实例 Element rootEle = docFactory.createElement("employees"); //创建文档根元素 doc.setRootElement(rootEle); //设置文档的根元素 if (empList !=null && empList.size()!=0){ for (Employee emp:empList){ Element empEle = docFactory.createElement("employee"); //循环创建rootEle的子元素employee Element codeEle = docFactory.createElement("code"); //循环创建empEle下的子元素code codeEle.setText(emp.getEmpCode()); //设置codeEle元素的文本值 Element nameEle = docFactory.createElement("name"); //循环创建empEle下的子元素name nameEle.setText(emp.getEmpName()); //设置nameEle元素的文本值 Element sexEle = docFactory.createElement("sex"); //循环创建empEle下的子元素sex sexEle.setText(emp.getEmpSex()); //设置sexEle元素的文本值 Element birthEle = docFactory.createElement("birth"); //循环创建empEle下的子元素birth String dateStr = new SimpleDateFormat("yyyy-MM-dd").format(emp.getEmpBirth()); birthEle.setText(dateStr); //设置birthEle元素的文本值 /* 将子元素添加到empEle中 */ empEle.add(codeEle); empEle.add(nameEle); empEle.add(sexEle); empEle.add(birthEle); rootEle.add(empEle); } /* 实现将Document对象保存为xml文件 */ String classPath = Tools.getClassPath(); //获取类路径 /* 创建目标要保存写入的xml文件 */ File xmlFile = new File(classPath+"com/xzit/doc/"+fileName); /* 创建Writer */ Writer writer = null; try { writer = new FileWriter(xmlFile); /* 创建XMLWriter */ XMLWriter xmlWriter = new XMLWriter(writer,OutputFormat.createPrettyPrint()); xmlWriter.write(doc); //保存为xml目标文件 } catch (Exception e) { e.printStackTrace(); }finally { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 读取目标xml文件封装为java对象 * @param fileName xml文件名称 * @return List 封装员工对象的链表集合 */ public static List<Employee> toEmployeeFromXML(String fileName){ List<Employee> empList = new ArrayList<>(); String classPath = Tools.getClassPath();//获取类路径 /* 基于路径建立文件对象 */ File xmlFile = new File(classPath+"com/xzit/doc/"+fileName); Reader reader = null; try { reader = new FileReader(xmlFile); //基于xml文件建立文件流 SAXReader saxReader = new SAXReader(); //建立SAXReader对象 Document doc = saxReader.read(reader); //读取xml文件 if (doc != null){ Element rootEle = doc.getRootElement(); //获取根元素 List<Element> emp_List = rootEle.elements("employee"); //获取所有根元素下的所有子元素emplopyee for (Element e:emp_List){ Employee empObj = new Employee(); String codeText = e.element("code").getText(); //获取元素code文本 empObj.setEmpCode(codeText); String nameText = e.element("name").getText(); //获取元素name文本 empObj.setEmpName(nameText); String sexText = e.element("sex").getText(); //获取元素sex文本 empObj.setEmpSex(sexText); String birthText = e.element("birth").getText(); //获取元素birth文本 empObj.setEmpBirth(new SimpleDateFormat("yyyy-MM-dd").parse(birthText)); empList.add(empObj); //添加员工对象到List集合中 } } } catch (Exception e) { e.printStackTrace(); }finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } return empList; } }
写入XML:
package com.xzit; import com.xzit.entity.Employee; import com.xzit.util.Dom4jXMLManager; import com.xzit.util.Tools; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Scanner; public class TestDom4jWriterXML { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("请输入员工信息"); List<Employee> empList = new ArrayList<Employee>(); while(true){ System.out.println("请输入员工编号"); String code = in.next(); System.out.println("请输入员工姓名"); String name = in.next(); System.out.println("请输入员工性别"); String sex = in.next(); System.out.println("请输入员工出生的年份"); int year = in.nextInt(); System.out.println("请输入员工出生的月份"); int month = in.nextInt(); System.out.println("请输入员工出生的日期"); int date = in.nextInt(); Date birth = Tools.toDate(year,month,date); Employee emp = new Employee(code,name,sex,birth); empList.add(emp); System.out.println("继续录入请输入1,结束录入请输入其它数组"); int tag = in.nextInt(); if (tag !=1) break; } String fileName = "employeeList.xml"; Dom4jXMLManager.toXMLFromEmployee(empList,fileName); } }
读取XML:
package com.xzit; import com.xzit.entity.Employee; import com.xzit.util.Dom4jXMLManager; import java.util.List; public class TestDom4jReaderXML { public static void main(String[] args) { String fileName = "employeeList.xml"; List<Employee> empList = Dom4jXMLManager.toEmployeeFromXML(fileName); for (Employee e:empList){ System.out.println(e.getEmpCode()+"\t"+e.getEmpName()+"\t"+e.getEmpSex()); } } }
员工类:
package com.xzit.entity; import java.util.Date; /** * 员工实体类 */ public class Employee { private String empCode; private String empName; private String empSex; private Date empBirth; public String getEmpCode() { return empCode; } public void setEmpCode(String empCode) { this.empCode = empCode; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public String getEmpSex() { return empSex; } public void setEmpSex(String empSex) { this.empSex = empSex; } public Date getEmpBirth() { return empBirth; } public void setEmpBirth(Date empBirth) { this.empBirth = empBirth; } public Employee(){} public Employee(String empCode, String empName, String empSex, Date empBirth) { this.empCode = empCode; this.empName = empName; this.empSex = empSex; this.empBirth = empBirth; } }