概念:
SAX(simple API for XML)是一种XML解析的替代方法。
而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,
但任何事物都有其相反的一面,对于SAX来说就是操作复杂。它也是事件驱动的
思想 :
- 和pull解析一样,要有一个工厂
- 用sax工厂方法,得到sax解析器
- 设置文件来源,和handler
- 使用代理的handler,进行解析
- 重写handler的方法
- 重点看代码
写了一天的代码,不想说话,看代码
static List<Play> list = null; //储存所有的play对象
static Play p = null;
private static void xmlSaxParserDemo() {
try {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new FileInputStream("E:\\CodeDemo\\HttpUrlConnection\\paly.xml"),new MyHandler());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
static class MyHandler extends DefaultHandler {
int type = -1; //用于开始节点的标识
@Override
public void startDocument() throws SAXException {
System.out.println("startDocument"); //用于初始化数据,如果没必要就不需要重写 只是执行一次
}
@Override
public void endDocument() throws SAXException { //文档结束时调用, 只是执行一次,可以不重写
System.out.println("endDocument");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//开始元素,是重点, 在这里进行分析
//qName就是我们的数据
switch (qName) {
case "PlayList":
list = new ArrayList<>();
break;
case "media":
p = new Play();
for (int i = 0; i < attributes.getLength(); i++) {
p.setDay(Integer.parseInt(attributes.getValue("day")));
p.setId(Integer.parseInt(attributes.getValue("id")));
}
break;
case "type":
type = 0;
break;
case "name":
type = 1;
break;
case "path":
type = 2; // 0,1,2用于下面方法 进行获取数据时,判断
break;
default:
break;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// System.out.println("endElement: " + "uri = " + uri + " localName = " + localName + " qName = " + qName);
//这是只对media 处理
if (qName.equals("media")) {
list.add(p);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// System.out.println("content: " + new String(ch,start,length));
String content = new String(ch,start,length);
switch (type) {
case 0:
p.setType(Integer.parseInt(content));
break;
case 1:
p.setName(content);
break;
case 2:
p.setPath(content);
break;
}
type = -1; //一定要记得置位 !
}
}
}