java之XML文件的解析方法Dom4j

XML文件
XML文件中的存储数据党需要被程序传输并使用的时候,因为XML语法是有别于其它语言的语法的,因此我们需要根据别的语言规则来将XML文件进行解析,我们把这个过程称之为XML数据的解析
XML文件的优点:XML相对于各种语言,它的定义都是一致的,解析的逻辑也是一致的,因此常常被用来进行各个语言之间的数据传递
XML文件的解析方式主要有三种:1.DOM解析 2.SAX解析 3.Dom4j解析
DOM解析:DOM解析是将XML文件全部加载到内存中,以结构树的对象模型来明确各个节点之间的联系和层次关系,方便我们对各个节点之间进行操作,具有很强的节点操作能力,但是DOM解析的缺点也是显而易见的,会占用较大的内存,因此解析的速度会比较慢,会给内存造成比较大的压力
SAX解析:SAX解析是将XML文件中的数据以接口的形式存放到内存中,然后根据要求,进行解析数据;因此,SAX解析的优点是能够快速解析数据,而且操作比较灵活.但是缺点就是无法标注各个节点之间的层次关系,获取操作功能单一性
Dom4j:则整合了DOM解析和SAX解析的特点,将XML文件的各个节点之间的关系通过接口来存放在内存中,然后根据要求进行解析,解析相对来说是比较快的
下面我们来解析一个简单的XML文件和学习一下Dom4j的一些简单的API

<学校 name = "清华学校">
<![[CDATA
清华学校
]]>
<老师们 name = "老师">
<Teacher id = "10000">
<name>王大锤</name>
<gender></gender>
<subject>艺术</subject>
<salary>800</salary>
</Teacher>
<Teacher id = "10086">
<name>毕加索</name>
<gender></gender>
<subject>美术</subject>
<salary>500</salary>
</Teacher>
<Teacher id = "10010">
<name>小苍老师</name>
<gender></gender>
<subject>生物</subject>
<salary>1000</salary>
</Teacher>
</老师们>
<学生们 name = "学生">
<student number = "001">
<name>王尼玛</name>
<gender></gender>
<class>一班</class>
</student>
<student number = "002">
<name>康师傅</name>
<gender></gender>
<class>三班</class>
</student>
<student number = "003">
<name>张全蛋</name>
<gender></gender>
<class>二班</class>
</student>
<student number = "004">
<name>马晓璐</name>
<gender></gender>
<class>八班</class>
</student>
</学生们>
</学校>

我们先简单地介绍一下Dom4j中提供的一些简单的API
1.创建流来解析数据

String path = System.getProperty("user.dir")+"/src/lessonXML/school.xml";
File file = new File(path);
    //根据Dom4j包提供的输入流来解析文件
SAXReader reader = new SAXReader();
    //解析后得到的是解析文档
Document document = reader.read(file);

2.通过解析到的解析文档来获取根节点,以及根节点的属性和根节点的内容

Element rootElement = document.getRootElement();
//获得根节点中的内容,要注意CDATA中的内容是不参与解析的,因此获取的时候包括括号中的空格,也会一起获取到
String string = rootElement.getText();//这个获取到的string中是包含空格键的
String string2 = rootElement.getTextTrim();//这种方法获取到的string中的空格键,系统会帮你处理到最简化
//通过key值来获取属性
Attribute attribute = rootElement.attribute("name");
//通过属性来获取属性的value值
String attriValue = attribute.getValue;
//通过属性来获取属性的key值
String attriKey = attribute.getName;

3.获取子节点

//通过节点的name来获取子节点
Element childElement = rootElement.element("老师们");
//如果一个节点下有多个子节点,可以获取子节点的集合
List<Element> elementList = rootElement.elements();

4.也可以通过子节点来获取父节点

Element parentElement = childElement.getParent;

5.获得一个节点的name和节点中的内容

String name = childElement.getName();
String value = childElement.getText();

解析XML文件的大致思路:
我们要解析XML文件,先要获取XML文件的路径,然后通过Dom4j中的输入流来解析XML文件,然后通过解析出的文档来获取根节点,然后一层层地获取子节点,知道最底层
最后的数据形式,大致是这样的:每一个学生都是一个hashMap,然后所有的学生装到学生们这个集合中,每一个老师也都是一个hashMap,然后所有的老师装到老师们这个集合中,
最后学校是一个hashMap,中装着key为学生们,和key为老师们的map.

//获取XML文件的解析路径
String path = System.getProperty("user.dir")+"/src/lessonXML/school.xml";
    File file = new File(path);
    //根据Dom4j包提供的输入流来解析文件
    SAXReader reader = new SAXReader();
    //获得解析到的文档
    Document document = reader.read(file);
    //获到根节点
    Element school = document.getRootElement();
    //获取根节点的子节点
    Element teachers = school.element("老师们");
    Element students = school.element("学生们");
    //获取子节点中的子节点
    List<Element> teacherList = teachers.elements();
    List<Element> studentList = students.elements();
        //存放老师们的集合collection
    Collection<HashMap<String, String>> teacherCollection = new ArrayList<>();
    //获取老师们的具体数据
    for (Element teacher : teacherList) //遍历老师们
    {
        //存放当前老师信息的map
        HashMap<String, String> teacherMap = new HashMap<>();
        //添加teacher节点属性,需要特殊操作
        teacherMap.put("id", teacher.attributeValue("id"));
        for (Object element : teacher.elements())
        {
            Element element2 = (Element)element;
            //key : 标签名 value :标签值
            teacherMap.put(element2.getName(), element2.getText());
        }
        //将老师一个个存放到老师们的集合中
        teacherCollection.add(teacherMap);
    }
    System.out.println(teacherCollection);
    //创建存放学生们的集合
    Collection<HashMap<String, String>> studentCollection = new ArrayList<>();
    //获取学生们的数据
    for (Element student : studentList) //遍历学生们
    {
        //存储当前这个学生信息的map
    HashMap<String, String> studentMap = new HashMap<>();
    //key 分别是三个子节点的名字,value对应的是字节点中key对应的value
    List<Element> elements = student.elements();
    for (Element element : elements) 
    {
        studentMap.put(element.getName(), element.getText());
    }
    //将当前学生的map装到学生们的collection中
    studentCollection.add(studentMap);
    System.out.println(studentMap);
    }
//  将学生们和老师们装在到一个map中
    HashMap<String, Collection<HashMap<String, String>>> schoolMap = new HashMap<>();
    schoolMap.put("teachers", teacherCollection);
    schoolMap.put("students", studentCollection);
    //将这个map撞到一个集合中
    Collection<HashMap<String, Collection<HashMap<String, String>>>> schoolCollection = new ArrayList<>();
    schoolCollection.add(schoolMap);
    System.out.println(schoolCollection);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值