zoukankan      html  css  js  c++  java
  • 用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("编号	姓名	生日	性别	住址");
            System.out.println("--------------------------------------------");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (Student s:students){
    
                System.out.println(s.getCode()+"	"+s.getName()
                        +"	"+sdf.format(s.getBirth())+"	"+s.getSex()+"	"+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()+"	"+e.getEmpName()+"	"+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;
        }
    }
  • 相关阅读:
    索引访问方法及索引优化
    AS3常用的几个顶级类
    AS3随鼠标移动的蜘蛛
    as去掉字符串中的重复字符
    AS单例模式
    移动的云朵
    (转)探索C++的秘密之详解extern "C"
    (转)YUV / RGB 格式及快速转换算法
    (转)如何解決TRDBD5M CMOS在DE2 delay的問題?
    (转)存储器类型
  • 原文地址:https://www.cnblogs.com/zengyu1234/p/15141743.html
Copyright © 2011-2022 走看看