第十二天-XML(SAX、Pull)
一、Dom(Document Object Mode)
1、特点
先把文档读到内存中,使用Dom来访问树形结构
2、缺点
比较耗内存,读取数据量大
二、SAX(Simple API XML)
1、定义
对文档进行顺序扫描,当扫描到四种情况(开始、结束文档、标签)的时候,会通知DefaultHandler中的方法(事件处理函数)一直重复这个动作,知道文档结束
2、优点
解析速度快,占用内存少
3、缺点
解析一个XML文件对应一个handler类,比较麻烦
4、特点
流式解析,解析是同步的读到那里就解析到那里
5、用法
1、自定义类继承DefaultHandler,重写四个方法(开始,结束文档和标签)
2、获得工厂 —SAXPorseFactory f = SAXPorseeFocatory.newInstance();
3、获得解析器—SAXParser p = f.newSAXParser();
4、设置解析文件和解析方式 —p.setParse(文件,第一步中的handler对象);
5、handler对象中的五个方法:
(1)、开始文档:初始化集合
(2)、结束文档:啥也不用写
(3)、开始标签:初始化对象,获得标签中的属性
(4)、结束标签:获得标签值 q.Name 添加集合
(5)、类型转换:new String(char[] , 0 , length);
(6)、返回该类集合:return ArrayList
6、代码
class MyHandler extends DefaultHandler{
String str; //用来存放解出来的字符串
@Override //开始文档
public void startDocument() throws SAXException {
super.startDocument();
}
@Override //标签开始
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")){
bean = new Bean();
bean.setId(attributes.getValue("id"));
}
}
@Override //标签结束
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("name")){
bean.setName(str);
}else if (qName.equals("author")){
bean.setAuthor(str);
}else if (qName.equals("year")){
bean.setYear(str);
}else if (qName.equals("price")){
bean.setPrice(str);
}
if ("book".equals(qName)){
beans.add(bean); ///添加集合
}
}
@Override //类型转换
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
str = new String(ch,start,length); //标签中间的值
}
@Override //结束文档
public void endDocument() throws SAXException {
super.endDocument(); //文档结束不做处理
}
/**
* 返回集合
* @return
*/
public ArrayList<Bean> getList(){
return beans;
}
}
三、Pull
1、定义
解析方式类似于SAX,当元素开始时调用Parse,nextText()
2、用法
四个常量
START_DOCUMENT — 文档开始
END_TAG —结束标签
常用方法
1、getEventType():获得当前事件类型
2、getAttributeValue() :获得该标签属性值
3、next(): 向下移动一个,获得标签类型
4、nextText() : 获得标签中间的值
5、getName(): 获得标签名
6、setImput(文件); 设置解析那个文件