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);
}
}
};