本帖最后由 如梦初醒 于 2012-4-4 10:37 编辑
听方立勋老师的视频sax解析案例(javabean封装xml文档数据这一课,看到方老师写了一个sax解析程序,于是自己用匿名内部类的方式也些了一个同样功能的程序,运行了一下,结果跟预期的一样。但是这里有个问题困惑着我,那就是怎么让外部类TestSax6得到匿名内部类new DefaultHandler(){}的list变量,我用了很多方法都不行,请网上的高手指点!!!
下面是源程序和xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<学生名册>
<学生>
<姓名>张三</姓名>
<性别>男</性别>
<年龄>20</年龄>
</学生>
<学生>
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>
</学生名册>
package com.crowndint.sax;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class TestSax6 {
public static void main(String[] args){
try {
new TestSax6();
} catch (Exception e) {e.printStackTrace();}
}
public TestSax6() throws Exception{
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
SAXParser saxParser=saxParserFactory.newSAXParser();
saxParser.parse("student.xml", new DefaultHandler(){
List<student> list=new ArrayList<student>();
String currentTag;
student s;
@Override
public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
currentTag=qName;
if("学生".equals(currentTag)){
s=new student();
}
}
@Override
public void characters(char[] ch, int start, int length){
if("姓名".equals(currentTag)){
s.setName(new String(ch,start,length));
}
if("性别".equals(currentTag)){
s.setMale(new String(ch,start,length));
}
if("年龄".equals(currentTag)){
s.setAge(Integer.parseInt(new String(ch,start,length)));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("学生".equals(qName)){
list.add(s);
//s=null;
}
currentTag=null;
}
@Override
public void endDocument() throws SAXException {
for(student s : list){
System.out.format("姓名:%s ,性别:%s ,年龄:%d\n", s.getName(),s.getMale(),s.getAge());
}
}
});
}
}
运行结果如下:
姓名:张三 ,性别:男 ,年龄:20
姓名:王五 ,性别:男 ,年龄:21
|