sax解析xml
// 得到SAXParserFactory
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// 得到SAXParser
SAXParser saxParser = saxParserFactory.newSAXParser();
// 得到XMLReader
XMLReader xmlReader = saxParser.getXMLReader();
// 给XMLReader设置监听
xmlReader.setContentHandler(handler);
// 解析文件 Parse解析的意思
xmlReader.parse(new InputSource(getAssets().open("student.xml")));
ContentHandler是接口,实现类 DefaultHandler
private ContentHandler handler = new DefaultHandler() {
private String targetName;
private List<Student> ss;
private Student student;
@Override
public void startDocument() throws SAXException {
System.out.println("读取文件开始");
ss = new ArrayList<Student>();
super.startDocument();
}
@Override
public void endDocument() throws SAXException {
System.out.println("读取文件结束");
System.out.println(ss);
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
targetName = localName;
System.out.println("读取开始标签" + targetName);
if ("student".equals(targetName)) {
student = new Student();
String value = attributes.getValue("id");
student.setId(Integer.parseInt(value));
}
super.startElement(uri, localName, qName, attributes);
}
@Override
public void endElement(String uri, String localName, String qName)throws SAXException {
// 用的是localName
System.out.println("读取结束标签" + localName);
if ("student".equals(localName)) {
System.out.println("-----" + student);
ss.add(student);
student = null;//可以不写
}
targetName = null;
/**当解析结束时置为空。这里很重要, 如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方 法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/
super.endElement(uri, localName, qName);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 判断targetname不为空后少执行3次(endElement后就不执行了),因为在endElement方法中将targetname置空,
if (targetName != null) {
String str = new String(ch, start, length);
System.out.println("text" + str);
if ("name".equals(targetName)) {
student.setName(str);
} else if ("age".equals(targetName)) {
student.setAge(Integer.parseInt(str));
}
super.characters(ch, start, length);
}
}
};