sax技术
单说面试题: 说请下下面的代码会出现什么问题?
byte bytes[]=new byte[1024*1024*1000];
bytes[0]=0;
System.out.println(bytes[0]);
实际考察你会不会 指定 jvm启动的 内存大小:
答: jvm机启动时有一个默认大小 jdk5.0 64m, 如果我们希望改变jvm机启动的内存大小可以通过修改 –Xmx?m 来处理 ?可以自己指定
1.为什么会出现sax技术
因为dom技术,会把整个xml文件加载到内存中,这样如果 xml过大,则可能会出现内存溢出.
1. sax技术可以在不加载全部 xml 文件时,就可以解析xml文档,看一个原理图:
sax技术的案例:
package com.sax.test;
import javax.xml.parsers.*;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Sax1 {
//使用sax技术去解析xml文件.myclasses2.xml
public static void main(String[] args) throws Exception, SAXException {
// TODO Auto-generated method stub
//1.创建SaxParserFactory
SAXParserFactory spf=SAXParserFactory.newInstance();
//2.创建SaxParser 解析器
SAXParser saxParser=spf.newSAXParser();
//3 把xml文件和事件处理对象关联
saxParser.parse("src/myclasses2.xml",new MyDefaultHandler2() );
}
}
//请思考,如何只显示学生的名字和年龄
class MyDefaultHandler2 extends DefaultHandler{
private boolean isName=false;
private boolean isAge=false;
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
String con=new String(ch,start,length);
if(!con.trim().equals("")&&(isName||isAge)){
System.out.println(con);
}
isName=false;
isAge=false;
//super.characters(ch, start, length);
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, name);
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if(name.equals("名字")){
this.isName=true;
}else if(name.equals("年龄")){
this.isAge=true;
}
}
}
//定义事件处理类
class MyDefaultHandler1 extends DefaultHandler{
//发现文档开始
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("startDocument()");
super.startDocument();
}
//发现xml文件中的一个元素
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
System.out.println("元素名称="+name);
}
//发现xml文件中的文本
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String con=new String(ch,start,length);
//显示文本内容:
if(!con.trim().equals("")){
System.out.println(new String(ch,start,length));
}
}
//发现xml文件中一个元素介绍
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, name);
}
//发现文档结束
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("endDocument()");
super.endDocument();
}
}
对sax说明:
1. sax主要用于对xml文件解析(读取),不能去修改,删除,添加元素
2. sax 是推机制,把发现的内容告诉程序员(函数),程序员可以自己决定如何处理
Xml:
xml version="1.0" encoding="utf-8" standalone="no"?><班级>
<学生>
<名字>宋江名字>
<年龄>23年龄>
<介绍>学习刻苦介绍>
学生>
<学生 sex="女">
<名字>林青霞名字>
<年龄>32年龄>
<介绍>是一个好学生介绍>
学生>
<学生 sex="男"><名字>小明2名字><年龄>34年龄><介绍>这是一个好孩子介绍>学生>班级>