SAX解析也是官方的一种XML文件解析方式,它是一种基于事件驱动的解析方式,使用到了回调机制。在解析的时候,并不会一次加载整个XML文件,而是以一种类似于流方式的加载方式。对于解析大型文件来说,十分有用。
SAX解析XML步骤:
1. 获取一个SAXParserFactory实例
2. 通过factory获取SAXParser实例
3. 创建一个ASAParserhandler对象
4. 新建一个继承自DefaultHandler类的ASAParserhandler类
5. 重写ASAParserhandler类的startDocument()、endDocument()、startElement()、endElement()、characters()等方法。
看例子:
public class SAXTest {
public static void main(String[] args) {
//获取一个SAXParserFactory实例
SAXParserFactory factory = SAXParserFactory.newInstance();
//通过factory获取SAXParser实例
try {
SAXParser parser = factory.newSAXParser();
//创建一个SASarserhandler对象
SASParserhandler handler = new SASParserhandler();
parser.parse("books.xml", handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
ASAParserhandler类:
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来标志解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
}
/**
* 用来遍历Xml文件的开始标签
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//开始解析book元素的属性
if (qName.equals("book")) {
System.out.println("-------------------开始遍历某一本书的内容---------------");
// //知道book元素下属性的名称,根据属性名称获取属性值
// String value = attributes.getValue("id");
// System.out.println("book的属性值是:"+value);
//不知道book元素下的属性以及个数,遍历获取
for (int i = 0; i < attributes.getLength(); i++) {
System.out.print("book元素的第"+(i+1)+"个属性名是: "+attributes.getQName(i));
System.out.println("---属性值为:"+attributes.getValue(i));
}
}else if(!qName.equals("book")&&!qName.equals("bookstore")){
System.out.print("节点名是:"+qName);
}
}
/**
* 用来遍历Xml文件的结束标签
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("-------------------结束遍历某一本书的内容---------------");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
Value = new String(ch, start, length);
if (!Value.trim().equals("")) {
System.out.println("---其节点值是:"+Value);
}
}