【文件处理】xml 文件 SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。
与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。
当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
局限性:
1. SAX分析器在对XML文档进行分析时,触发了一系列的事件,由于事件触发本身是有时序性的,因此,SAX提供的是一种顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。
即,一旦经过了某个元素,我们没有办法返回去再去访问它。
2. SAX分析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。
也就是说,SAX分析器在实现时,只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分、是否符合XML语法,然后再触发相应的事件,而事件处理函数本身则要由应用程序自己来实现。
同DOM分析器相比,SAX分析器缺乏灵活性。
优势:
然而,由于SAX分析器实现简单,对内存要求比较低,(SAX不必将整个XML文档加载到内存当中,因此它占据内存要比DOM小), 因此实现效率比较高。
对于大型的XML文档来说,通常会用SAX而不是DOM。
并且对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。
SAX分析器
XML解析器实际上就是一段代码,它读入一个XML文档并分析其结构。
分类:
带校验的解析器
不校验的解析器(效率高)
支持DOM的解析器(W3C的官方标准)
支持SAX的解析器(事实上的工业标准)
SAX是事件驱动的,文档的读入过程就是SAX的解析过程。
在读入的过程中,遇到不同的项目,解析器会调用不同的处理方法。
【XML文件内容】
<?xml version = "1.0" encoding = "UTF-8"?> <students> <student > <name>tonyliu</name> <age>19</age> <sex>男</sex> <group> <id>1</id> <name>Group1</name> </group> </student> <student > <name>Susywang</name> <age>18</age> <sex>女</sex> <group> <id>2</id> <name>Group2</name> </group> </student> <student > <name>JackZhang</name> <age>35</age> <sex>男</sex> <group> <id>3</id> <name>Group3</name> </group> </student> </students>
【SAX 解析代码】
根据xml文件内容分为2个类,一个是Student类另一个为Group类,分别记入相对应的字段。
再定义一个枚举,分别存入一些常量,方便调用。这里要注意的是,仔细看一下xml内容,会发现Student以及group类中都包含了id跟name的字段。所以当我们在写代码中为了让计算机清楚的知道我们指的name,id到底是Student中的还是Group中的,要通过Enum定义的常量来区分。
package Entity; public class Student { private int id; private String name; private int age; private String sex; private Group group; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Group getGroup() { return group; } public void setGroup(Group group) { this.group = group; } public Student(int id, String name, int age, String sex, Group group) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; this.group = group; } public Student() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "Student [age=" + age + ", group=" + group + ", > id + ", name=" + name + ", sex=" + sex + "]"; } }
package Entity; public class Group { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Group() { super(); // TODO Auto-generated constructor stub } public Group(int id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return "Group [>; } }