SAX解析是事件驱动,需要为SAX解析器设置一个ContentHandler,下面是使用SAX解析XML的方法:
//SAX解析XML文件
public List SAXParseToList( InputStream in) throws Exception
{
SAXParserFactory factory= SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
MySAXHandler handler=new MySAXHandler();
parser.parse(in, handler);
list=handler.getList();
in.close();
return list;
}
SAX的ContentHandler
//SAX ContentHandler
private class MySAXHandler extends DefaultHandler{
private List<Person> list;
private String tagname;
Person person;
public List<Person> getList(){
return list;
}
//遇到新节点
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
tagname=localName;
if(localName.equals("person"))
{
person=new Person();
person.id=attributes.getValue("id");
}
}
//文档开始
@Override
public void startDocument() throws SAXException {
list=new ArrayList<>();
}
//遇到文本信息
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String str=new String(ch,start,length);
if(tagname!=null){
switch (tagname){
case "name":
person.name=str;
break;
case"age":
person.age=Integer.parseInt(str);
break;
}}
}
//遇到节点结束标志
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(localName.equals("person")) {
list.add(person);
person=null;
}
tagname=null;
}