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);