SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口
teachers.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<teachers>
<teacher id="1">
<name>张三</name>
<course>数学</course>
<age>29</age>
</teacher>
<teacher id="2">
<name>李四</name>
<course>外语</course>
<age>22</age>
</teacher>
<teacher id="3">
<name>王五</name>
<course>语文</course>
<age>28</age>
</teacher>
</teachers>
Teacher对象类
package teacherbo;
public class Teacher {
private String id;
private String name;
private String course;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Teacher(String id, String name, String course, int age) {
super();
this.id = id;
this.name = name;
this.course = course;
this.age = age;
}
public Teacher() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + ", course=" + course
+ ", age=" + age + "]";
}
}
interface XmlTeacherPerse接口类
package teacherbo;
import java.util.List;
public interface XmlTeacherPerse {
public List<Teacher> teacherParseXml(String fileName);
}
MySaxHandlerTeacher解析类:
package teachersax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import teacherbo.Teacher;
public class MySaxHandlerTeacher extends DefaultHandler {
private String tag;//标记元素
private Teacher teacher;
private List<Teacher> list;//容器
//返回list
public List<Teacher> getList(){
return list;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
//第一步,
list=new ArrayList<Teacher>();//创建一个Teacher类型的对象放到list容器中
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//第二步
if(qName.equals("teacher")){
teacher=new Teacher();//创建一个Teacher对象
String id=attributes.getValue("id");//获取id的值
teacher.setId(id);
}
tag=qName;//标记第几个teacher
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
//第三部解析
if(qName.equals("teacher")){
list.add(teacher);//添加到容器list中
teacher=null;//刷新本次teacher值
}
tag=null;//刷新本次标记的值,为不影响写一次解析标记的值
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
//第四步:解析内容
if(tag!=null){
//返回字符串的副本,忽略前导空白和尾部空白。
String str=new String(ch, start, length).trim();
if(tag.equals("name")){
teacher.setName(str);
}
if(tag.equals("course")){
teacher.setCourse(str);
}
if(tag.equals("age")){
//强制类型转换
teacher.setAge(Integer.parseInt(str));
}
}
}
}
SaxParserTeacher解析,测试类
package teachersax;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import teacherbo.Teacher;
import teacherbo.XmlTeacherPerse;
public class SaxParserTeacher implements XmlTeacherPerse {
public static void main(String []args){
//接口创建实现类对象
XmlTeacherPerse perser=new SaxParserTeacher();
List<Teacher> list=perser.teacherParseXml("teachers.xml");//解析对象
System.out.println("SAX解析结果");
for(Teacher teacher:list){
System.out.println(teacher);
}
}
//接口类中的实现
@Override
public List<Teacher> teacherParseXml(String fileName) {
List<Teacher> list=new ArrayList<Teacher>();//创建一个Teacher类型的容器
//获取 SAXParserFactory 的一个新实例。
SAXParserFactory factory=SAXParserFactory.newInstance();
MySaxHandlerTeacher handler=null;//创建一个MySaxHandlerTeacher对象,赋值为空
try {
//使用当前配置的工厂参数创建 SAXParser 的一个新实例,返回类型是SAXParser
SAXParser parser=factory.newSAXParser();
//创建一个文件
InputStream is=new FileInputStream(fileName);
//创建MySaxHandlerTeacher对象
handler=new MySaxHandlerTeacher();
// 使用指定的 DefaultHandler 将指定文件的内容解析为 XML。
parser.parse(is, handler);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
list=handler.getList();//返回List类型的容器Teacher
return list;//返回list
}
}
DOM解析
Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件
package domteacher;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import teacherbo.Teacher;
import teacherbo.XmlTeacherPerse;
public class DomTeacherXmlParser implements XmlTeacherPerse {
public static void main(String[] args) {
XmlTeacherPerse perser=new DomTeacherXmlParser();
List<Teacher> list=perser.teacherParseXml("teachers.xml");
System.out.println("解析结果:");
for(Teacher teacher:list){
System.out.println(teacher);
}
}
@Override//DOM解析Xml
public List<Teacher> teacherParseXml(String fileName) {
List<Teacher> list=new ArrayList<Teacher>();
//创建一个工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
Document document=null;
try {
//使用当前参数创建一个DocumentBuilder实例
DocumentBuilder builder=factory.newDocumentBuilder();
//将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。
document=builder.parse(fileName);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。,Element强制类型转化成Node
Node rootNode=(Node)document.getDocumentElement();
//获得<teacher>元素列表,getChildNodes()包含此节点的所有子节点的 NodeList。
NodeList teacherElementList=rootNode.getChildNodes();
for(int i=0;i<teacherElementList.getLength();i++){
Node teacherelement=(Node)teacherElementList.item(i);
if(teacherelement.getNodeName().equals("teacher")){
Teacher teacher=new Teacher();
//getAttributes()包含此节点的属性的 NamedNodeMap(如果它是 Element);否则为 null。
NamedNodeMap map=teacherelement.getAttributes();
// getNamedItem("id")检索通过名称指定的节点。
Node idNode=(Node)map.getNamedItem("id");
//getNodeValue()此节点的值,取决于其类型
String idString=idNode.getNodeValue();
teacher.setId(idString.trim());
NodeList subTeacherElementList=teacherelement.getChildNodes();
for(int j=0;j<subTeacherElementList.getLength();j++){
Node subElementNode=(Node)subTeacherElementList.item(j);
String subElementNameString=subElementNode.getNodeName();
if(subElementNameString.equals("name")){
//获得内容name
teacher.setName(subElementNode.getTextContent().trim());
}
if(subElementNameString.equals("course")){
//获得内容course
teacher.setCourse(subElementNode.getTextContent().trim());
}
if(subElementNameString.equals("age")){
//获得内容age,强制类性转换
teacher.setAge(Integer.parseInt(subElementNode.getTextContent().trim()));
}
}
list.add(teacher);
}
}
return list;
}
}