Java读写XML

1、XML是什么

xml是Extensible Markup Language的缩写,可扩展标记语言。由程序编写者自定义实现,xml主要用来以标记的文本形式表示一组或多组数据,很多计算机语言都提供对xml文件的解析,使用xml文件格式传递数据可以实现跨平台计算机编程语言,xml是W3C组织推荐的数据交换格式标准。
XML是一种数据交换的格式标准。

2、XML的语法

  • 标准声明为:<?xml version ="1.0" encoding = "UTF-8"?>
  • 标签应封闭,像html标签那样。
  • 大小写敏感,如message标签和Message标签是完全不同的。
  • 至少有一个根元素。
  • 属性值必须带引号。
  • 实体引用:
    &lt 表示 <
    &gt表示 >
    &amp表示 &
    &apos表示 单引号
    &quot表示 双引号
  • xml中的注释:<!--This is a content-->。
  • xml元素:xml中的元素以尖括号成对出现,如<student></student>,有开始标签必须有关闭标签,成对出现。
  • xml属性:xml中属性是用来描述元素特征的,必须由名称和值组成,之间用=实现赋值,属性值必须带引号,当属性值本身带有双引号时,必须用单引号或使用实体符号表示双引号。

3、Java写入和读取XML文件

以下介绍使用Jdom和Dom4j这两种方法来对XML文件进行读写。先将依赖包加进来:
在这里插入图片描述
这两个包一定要build到path中去。

(1)使用Dom4j

dom4j是由第三方提供的扩展子JDOM API的一组解析XML文件的Java实现,只和Java相关。dom4j对XML文件的解析与jdom类似,是将XML文档中的每个节点(node)称之为Element(元素),并提供对元素上下级元素的获取方法。以下用代码实现读取和写入。

a、dom4j写入XML

首先准备好实体类,如下:

public class Person {
    
    private String code;
    
    private String name;
    
    private String sex;
    
    private Date birthday;

    public Person() {
        
    }

    //构造方法
    public Person(String code,String name,String sex,Date birthday) {
        this.code = code;
        this.name = name;
        this.sex = sex;
        this.birthday = birthday;
    }
    
    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 String getSex() {
        return sex;
    }

    
    public void setSex(String sex) {
        this.sex = sex;
    }

    
    public Date getBirthday() {
        return birthday;
    }

    
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
    
}

建立一个工具类,里面定义写入和读取的方法,如下:

/*
 * dom4j的工具类
 */
public class Dom4jManager {
    
    //获取文档工厂实例
    private static final DocumentFactory documentFactory = DocumentFactory.
            getInstance();
    
    //定义方法,写入XMl文件
    public static void toXMLFromPerson(List<Person> pers,String fileName) {
        //创建文档对象
        Document document = documentFactory.createDocument("utf-8");
        //创建XML文件的根节点
        Element element = documentFactory.createElement("persons");
        //文档设置根节点
        document.setRootElement(element);
        //遍历集合,将集合中的对象添加到XML文件
        if(pers != null && pers.size()!=0) {
            for(Person p:pers) {
                //创建一级子节点
                Element oneElement = documentFactory.createElement("person");
                //创建一级子节点下的code节点
                Element code = documentFactory.createElement("code");
                //为code节点设置文本值
                code.setText(p.getCode());
                //创建一级子节点下的name节点
                Element name = documentFactory.createElement("name");
                //为name节点设置文本值
                name.setText(p.getName());
                //创建一级子节点下的sex节点
                Element sex = documentFactory.createElement("sex");
                //设置文本值
                sex.setText(p.getSex());
                //创建一级子节点下的birthday节点
                Element birthday = documentFactory.createElement("birthday");
                //日期格式转成文本
                String birthdayStr = new SimpleDateFormat("yyyy-MM-dd").format(p.getBirthday());
                //设置文本值
                birthday.setText(birthdayStr);
                //一级节点添加子节点
                oneElement.add(code);
                oneElement.add(name);
                oneElement.add(sex);
                oneElement.add(birthday);
                //根节点添加一级子节点
                element.add(oneElement);
            }
            //定义XML文件的输出路径
            String path = "F:/Users/Administrator/Desktop";
            File file = new File(path + "/" + fileName);
            try {
                //文件写入对象
                Writer writer = new FileWriter(file);
                //XML写入对象
                XMLWriter xmlWriter = new XMLWriter(writer,OutputFormat.createPrettyPrint());
                //写入xml文档
                xmlWriter.write(document);
                //关闭流
                xmlWriter.close();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("XML写入成功,请查看!");
        }
    }

}

下面测试写入:

public class TestDom4jWrite {
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        List<Person> list = new ArrayList<>();
        System.out.println("请输入员工信息:");
        System.out.println("-------------------------------");
        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 day = in.nextInt();
            //日期转换
            Calendar calendar = Calendar.getInstance();
            calendar.set(year, month-1, day);
            Date birth = calendar.getTime();
            Person person = new Person(code, name, sex, birth);// 实例化对象
            list.add(person);// 添加到集合
            System.out.println("继续输入请输入1,结束请输入其他数字:");
            int temp = in.nextInt();
            if (temp != 1) {// 不等于1则跳出循环
                break;
            }
        }
        String fileName = "person.xml";// 要保存的xml文件名称
        Dom4jManager.toXMLFromPerson(list, fileName);// 调用方法保存
    }

}

执行,控制台输入以下内容:

请输入员工信息:
-------------------------------
请输入员工编号:
10001
请输入员工姓名:
猿A
请输入员工性别:
男
请输入员工生日年份:
1994
请输入员工生日月份:
10
请输入员工生日天数:
11
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
10002
请输入员工姓名:
猿B
请输入员工性别:
男
请输入员工生日年份:
1990
请输入员工生日月份:
9
请输入员工生日天数:
2
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
10002
请输入员工姓名:
猿C
请输入员工性别:
男
请输入员工生日年份:
1994
请输入员工生日月份:
8
请输入员工生日天数:
14
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
10003
请输入员工姓名:
猿D
请输入员工性别:
男
请输入员工生日年份:
1889
请输入员工生日月份:
4
请输入员工生日天数:
12
继续输入请输入1,结束请输入其他数字:
2
XML写入成功,请查看!

查看桌面:
在这里插入图片描述
打开这个文件查看内容:
在这里插入图片描述
写入成功了。

下面总结一下dom4j写入XML文件的流程:

  • 获取文档工厂实例。
  • 创建文档对象。
  • 创建XML文件的根节点。
  • 文档设置根节点。
  • 创建一级子节点,创建一级子节点下的子节点,子节点赋值。
  • 一级子节点添加子节点,根节点添加一级子节点。
  • 创建文件写入对象和XML写入对象,写入XML文件。
  • 关闭流。

b、dom4j读取XML

在Dom4jManager中添加以下内容:

    //定义方法,读取XML文件
    public static List<Person> readXML(String fileName){
        //容器
        List<Person> persons = new ArrayList<Person>();
        //XML所在目录
        String path = "F:/Users/Administrator/Desktop";
        //文件对象
        File file = new File(path + "/" + fileName);
        try {
            //文件输入流对象
            Reader reader = new FileReader(file);
            //创建SAXReader对象
            SAXReader saxReader = new SAXReader();
            //读取,返回文档对象
            Document document = saxReader.read(reader);
            if(document != null) {
                //获取根节点
                Element element = document.getRootElement();
                //获取根节点下的所有一级子节点
                List<Element> eles = element.elements();
                for(Element e:eles) {
                    Person per = new Person();
                    //获取code值
                    String code = e.element("code").getText();
                    //对象赋值
                    per.setCode(code);
                    //获取name值
                    String name = e.element("name").getText();
                    per.setName(name);
                    //获取sex值
                    String sex = e.element("sex").getText();
                    per.setSex(sex);
                    //获取birthday值
                    String birthStr = e.element("birthday").getText();
                    //转换成日期格式
                    Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthStr);
                    per.setBirthday(birthday);
                    persons.add(per);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return persons;
    }

测试读取:

public class TestDom4jRead {
    
    public static void main(String[] args) {
        String fileName = "person.xml";
        List<Person> list = Dom4jManager.readXML(fileName);
        for(Person p:list) {
            System.out.println(p.getCode() + "=======>" + p.getName() + "=======>" 
             + p.getSex() + "=======>" + p.getBirthday());
        }
    }

}

执行,控制台:
在这里插入图片描述
那么读取成功了。

dom4j读取XML的流程为:

  • 创建文件输入流对象。
  • 创建SAXReader对象。
  • SAXReader对象读取流对象,返回文档对象。
  • 获取根节点。
  • 获取根节点下的所有一级子节点。
  • 获取一级子节点下的节点值,最后封装成对象。

(2)使用jdom

JDOM是一种使用 XML(标准通用标记语言下的一个子集) 的独特Java工具包,它的设计包含Java语言的语法乃至语义。JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。

JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。Jdom是用Java语言读、写、操作XML的新API函数。

a、jdom写入XML

建立新的工具类,如下:

/*
 * jdom工具类
 */
public class JdomManager {
    
    private static XMLOutputter xmlOutputter = null;
    
    //定义方法,写入XML文件
    public static void writeXML(List<Person> pers,String fileName) throws IOException {
        //创建根节点
        Element element = new Element("persons");
        //创建文档对象
        Document document = new Document();
        //文档设置根节点
        document.addContent(element);
        if(pers !=null && pers.size()!=0) {
            for(Person p:pers) {
                //创建一级子节点
                Element oneElement = new Element("person");
                //创建一级子节点下的code节点
                Element code = new Element("code");
                //为code节点设置文本值
                code.setText(p.getCode());
                //创建一级子节点下的name节点
                Element name = new Element("name");
                //为name节点设置文本值
                name.setText(p.getName());
                //创建一级子节点下的sex节点
                Element sex = new Element("sex");
                //设置文本值
                sex.setText(p.getSex());
                //创建一级子节点下的birthday节点
                Element birthday = new Element("birthday");
                //日期格式转成文本
                String birthdayStr = new SimpleDateFormat("yyyy-MM-dd").format(p.getBirthday());
                //设置文本值
                birthday.setText(birthdayStr);
                //一级节点添加子节点
                oneElement.addContent(code);
                oneElement.addContent(name);
                oneElement.addContent(sex);
                oneElement.addContent(birthday);
                //根节点添加一级子节点
                element.addContent(oneElement);
            }
        }
        //文件保存路径
        String path = "F:/Users/Administrator/Desktop";
        File file = new File(path + "/" + fileName);
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        //获取XMLOutputter对象
        XMLOutputter xmlOutputter = getXmlOutputter();
        //写入XML文件
        xmlOutputter.output(document, fileOutputStream);
        //关闭流
        fileOutputStream.close();
        System.out.println("XML文件创建完成!");
    }
    
    //获取XMLOutputter对象
    private static XMLOutputter getXmlOutputter() {
        if(xmlOutputter == null) {
            xmlOutputter = new XMLOutputter();
        }
        return xmlOutputter;
    }

}

测试XML写入:

public class TestJdomWrite {
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        List<Person> list = new ArrayList<>();
        System.out.println("请输入员工信息:");
        System.out.println("-------------------------------");
        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 day = in.nextInt();
            //日期转换
            Calendar calendar = Calendar.getInstance();
            calendar.set(year, month-1, day);
            Date birth = calendar.getTime();
            Person person = new Person(code, name, sex, birth);// 实例化对象
            list.add(person);// 添加到集合
            System.out.println("继续输入请输入1,结束请输入其他数字:");
            int temp = in.nextInt();
            if (temp != 1) {// 不等于1则跳出循环
                break;
            }
        }
        String fileName = "person2.xml";// 要保存的xml文件名称
        Dom4jManager.toXMLFromPerson(list, fileName);// 调用方法保存
    }

}

执行,在控制台输入以下内容:

请输入员工信息:
-------------------------------
请输入员工编号:
code001
请输入员工姓名:
高富帅
请输入员工性别:
男
请输入员工生日年份:
1990
请输入员工生日月份:
9
请输入员工生日天数:
12
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
code002
请输入员工姓名:
白富美
请输入员工性别:
女
请输入员工生日年份:
1994
请输入员工生日月份:
9
请输入员工生日天数:
10
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
code003
请输入员工姓名:
路人甲
请输入员工性别:
男
请输入员工生日年份:
1997
请输入员工生日月份:
2
请输入员工生日天数:
12
继续输入请输入1,结束请输入其他数字:
2
XML写入成功,请查看!

查看桌面:
在这里插入图片描述
打开xml文件查看内容:
在这里插入图片描述
那么写入成功了,其实可以看到,jdom和dom4j写入XML的流程基本相同,只是用到的类不同方法略有差异。

b、jdom读取XML

在JdomManager工具类中添加以下内容:

private static SAXBuilder saxBuilder = null;


    //定义方法,读取XML文件
    public static List<Person> readXML(String fileName){
        //容器
        List<Person> persons = new ArrayList<Person>();
        //XML所在目录
        String path = "F:/Users/Administrator/Desktop";
        //文件对象
        File file = new File(path + "/" + fileName);
        try {
            //文件输入流对象
            Reader reader = new FileReader(file);
            //获取SAXBuilder对象
            SAXBuilder saxBuilder = getSaxBuilder();
            //读取,返回文档对象
            Document document = saxBuilder.build(file);
            if(document != null) {
                //获取根节点
                Element element = document.getRootElement();
                //获取根节点下的所有一级子节点
                List<Element> eles = element.getChildren();
                for(Element e:eles) {
                    Person per = new Person();
                    //获取code值
                    String code = e.getAttribute("code").getValue();
                    //对象赋值
                    per.setCode(code);
                    //获取name值
                    String name = e.getAttribute("name").getValue();
                    per.setName(name);
                    //获取sex值
                    String sex = e.getAttribute("sex").getValue();
                    per.setSex(sex);
                    //获取birthday值
                    String birthStr = e.getAttribute("birthday").getValue();
                    //转换成日期格式
                    Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthStr);
                    per.setBirthday(birthday);
                    persons.add(per);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return persons;
    }
    
    //获取SAXBuilder对象
    private static SAXBuilder getSaxBuilder() {
        if(saxBuilder == null) {
            saxBuilder = new SAXBuilder();
        }
        return saxBuilder;
    }

测试读取:

public class TestJdomRead {
    
    public static void main(String[] args) {
        String fileName = "person2.xml";
        List<Person> list = Dom4jManager.readXML(fileName);
        for(Person p:list) {
            System.out.println(p.getCode() + "=======>" + p.getName() + "=======>" 
             + p.getSex() + "=======>" + p.getBirthday());
        }
    }

}

执行,控制台输出:
在这里插入图片描述
那么读取成功了,可以看到,jdom和dom4j读取XML文件的流程也基本相同,只是使用的类和方法不同,步骤都一样。

4、总结

对XML文件进行读写操作肯定还有其他的方法,但是掌握Jdom和Dom4j这两种工具应该够用了,学会对XML文件的读取和写入,以后工作中肯定会用的到。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值