(1)使用SAX读取XML文件;它采用的是事件驱动,并不需要解析完整个文档,速度快并且占用内存少。需要为SAX提供实现ContentHandler接口的类。
PersonDefaultHandler.java
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 com.sinber.domain.Person;
public class PersonDefaultHandler extends DefaultHandler
{
private List<Person> persons;
private Person person ; //记录当前person
private String perTag; //记录前一个标签的名称 /** * 重写父类的开始文档方法。用于初始化 */
@Override
public void startDocument()
throws SAXException {
persons = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if("person".equals(localName)){
Integer id = new Integer(attributes.getValue(0)); //取id
person = new Person();
person.setId(id);
}
perTag = localName;
} /**参数: * ch 整个XML字符串 * start 节点值在整个XML字符串中的索引位置 * length 节点值的长度 */
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(perTag!=null){
String data = new String(ch,start,length);
if("name".equals(perTag)){
person.setName(data);
}
else if("age".equals(perTag)){
person.setAge(new Short(data));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
persons.add(person);
person = null;
}
perTag = null;
}
public List<Person> getPersons() {
return persons;
}
}
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.sinber.domain.Person;
public class PersonDefaultHandler extends DefaultHandler
{
private List<Person> persons;
private Person person ; //记录当前person
private String perTag; //记录前一个标签的名称 /** * 重写父类的开始文档方法。用于初始化 */
@Override
public void startDocument()
throws SAXException {
persons = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if("person".equals(localName)){
Integer id = new Integer(attributes.getValue(0)); //取id
person = new Person();
person.setId(id);
}
perTag = localName;
} /**参数: * ch 整个XML字符串 * start 节点值在整个XML字符串中的索引位置 * length 节点值的长度 */
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(perTag!=null){
String data = new String(ch,start,length);
if("name".equals(perTag)){
person.setName(data);
}
else if("age".equals(perTag)){
person.setAge(new Short(data));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
persons.add(person);
person = null;
}
perTag = null;
}
public List<Person> getPersons() {
return persons;
}
}
SAXPerson.java
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import com.sinber.domain.Person;
public class SAXPerson{
public static List<Person> getPerson() throws Exception{ //通过类装载器获取文件
InputStream inStream = SAXPersonService.class.getClassLoader().getResourceAsStream("person.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
PersonDefaultHandler handler = new PersonDefaultHandler();
saxParser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
}
}
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import com.sinber.domain.Person;
public class SAXPerson{
public static List<Person> getPerson() throws Exception{ //通过类装载器获取文件
InputStream inStream = SAXPersonService.class.getClassLoader().getResourceAsStream("person.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
PersonDefaultHandler handler = new PersonDefaultHandler();
saxParser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
}
}