用Java实现XML读写

XML文件介绍

XML(EXtensible Markup Language)扩展性标记语言。由程序设计编写者自定义实现

XML主要用来以标记文本形式表示一组或多组数据,很多计算机语言都提供对XML文件的解析,使用XML格式传递数据可以实现跨平台跨计算机编程语言

XMLW3C组织强烈推荐的数据交换格式标准

 

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”(或者XMLXml)开始

名称不能包含空格

 

XML元素属性

XML中属性是用来描述元素特征的,它必须由名称和值组成,之间用“=”符号实现赋值,属性值必须使用单引号或双引号包围

<user name=”东方不败”  age=35></user>

 

特殊情况:

如果属性值本身包含双引号,那么有必要使用单引号包围它,就像这个

<gangster name=GeorgeShotgunZiegler>

或者可以使用实体引用:

<gangster name=George"Shotgun"Ziegler>

 

JDOM解析XML文件

  1. Jdom是由第三方提供和维护的一组标准的java实现,用来以java语言形式解析XML文档;因此它只适合Java平台语言,因此它只适合Java平台语言,Jdom不遵循任何DOM实现标准,它只和Java相关。
  2. JdomXML文档实现最为简单的读写操作,jdomXML文档中的每个节点(node)称之为Element(元素),并提供对元素上下级元素的获取等实用方法。
  3. Jdom解析XML文件大体分类两种操作

(1) 读取目标XML文档并解析,封装成运行时的Java对象进行处理

(2) 将运行时Java对象以XML文件方式写入硬盘存储

 

JDOM读取XML文档

  1. 创建SAXBuilder用来构建加载目标XML文档
  2. 基于XML路径创建XML文件对象
  3. 使用SAXBuilder加载XML文件对象
  4. 利用JDOM相关方法解析XML文档封装为Java对象

 

idea默认不编译项目中的xml文件,需要在pombuild模块下添加如下代码

<build>

<resources>

<resource>

<directory>src/main/java</directory>

<includes>

<include>**/*.xml</include>

</includes>

<filtering>true</filtering>

</resource>

</resources>

</build>

 

DOM4J解析XML文件

  1. dom4j是由第三方提供扩展子JDOMAPI的一组解析XML文件的java实现,它只和Java相关。
  2. dom4jXML文档实现与JDOM类似,jdomXML文档中的每个节点(node)称之为Element(元素),并提供对元素上下级元素的获取等实用方法。
  3. dom4j解析XML大体分类两种擦欧洲哦

(1) 读取目标XML文档并解析,封装成运行时的Java对象进行处理。

(2) 将运行时Java对象以XML文件方式写入硬盘存储。

 

DOM4J写入XML文档

  1. 创建DocumentFactory用来创建Document对象
  2. 使用DOM4J实现对Document对象操作
  3. 创建XMLWriter用来将Document对象写入XML文件
  4. 关闭相关文件流

 

DOM4J读取XML文档

  1. 基于xml文件路径创建File对象
  2. 创建SAXReader用来加载xml文件为Document
  3. 利用DOM4J相关方法解析XML文档
  4. 封装文档对象数据为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;
    }
}

 

posted @ 2021-08-14 20:23  伊万  阅读(1699)  评论(0编辑  收藏  举报