前面已经提到了XML解析的方式。
今天就讲一下SAX解析,相比于DOM解析,它的语义更加清楚,而且能够控制是否停止解析,而DOM解析会将XML文件全部解析一遍。
以下是代码:
package internet;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import javax.xml.parsers.ParserConfigurationException;
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 SaxParseDemo {
// HashMap<String, ArrayList<OutlineInfo>>
String qname;
/**
*
* @param inputStream
* @throws ParserConfigurationException
* 属性设置异常
* @throws SAXException
* @throws IOException
*/
public static void saxParse(InputStream inputStream)
throws ParserConfigurationException, SAXException, IOException {
// 1.sax解析器的工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
// 2.sax解析器
SAXParser saxParser = spf.newSAXParser();
// 3.声明MyDefaultHandler对象
SaxParseDemo demo = new SaxParseDemo();
MyDefaultHandler mdh = demo.new MyDefaultHandler();
// 4.解析流
saxParser.parse(inputStream, mdh);// dh:帮助类的DefaultHandler的对象
}
/**
* 帮助类
*/
public class MyDefaultHandler extends DefaultHandler {
/**
* 开始解析整个xml文档
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
// 新建map对象
}
/**
* 开始解析标签
*
* @parm uri-->前缀
* @parm localName-->标签名,没有前缀
* @parm qName-->标签名,有前缀,例如ViewPager的前缀就是包名
* @parm attributes-->属性
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// attributes.getLength();//属性的个数
// //第一个属性的值
// attributes.getValue(0);//用index最好,通过标签获取
if ("person".equals(qName) && attributes.getLength() == 1) {
// 新建封装类对象
// 设置id属性
} else {
qname = qName;
}
}
/**
* 标签头和标签尾之前的内容
*
* @parm ch-->字符数组可能存在很长的内容,比如ch只有100个字符,读取的是1024,就会浪费很多空格
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String content = new String(ch, start, length);
}
/**
* 结束标签
*
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
qname = null;
if (qName.equals("person")) {
// 置空对象
}
}
/**
* 结束整个XML文件
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
}