SAX方式解析XML的步骤:
1、通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory
2、SAXParseFactory实例的newSAXParse()方法返回SAXParser实例parser
3、创建一个类继承DefaultHandle,重写方法进行业务已处理,创建这个类的实例handle
新建一个XML文件demo.xml,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>放学后</name>
<author>lcb</author>
<year>2010</year>
<price>25</price>
</book>
<book id="2">
<name>你的孤独,虽败犹荣</name>
<author>刘同</author>
<year>2011</year>
<price>30</price>
</book>
</bookstore>
新建SAXHandler.java类并继承DefaultHandle,并重写startElement()、endElement()、startDocument()、endDocument()方法
package com.imooc.io;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXHandler extends DefaultHandler {
/**
* 解析XML的开始标签
*/
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
//开始解析book元素
if(qName.equals("book")){
//已知book元素属性的名称,根据属性名获取属性值
//String value = attributes.getValue("id");
//System.out.println("book的属性值是:"+value);
//获取book元素属性的长度
int num = attributes.getLength();
for(int i = 0; i<num; i++){
System.out.println("book元素第"+(i+1)+"个属性名是:"+attributes.getQName(i));
System.out.println("book元素第"+(i+1)+"个属性值是:"+attributes.getValue(i));
}
}
//如果不是book标签和bookstore标签,进行输出节点名
else if(!qName.equals("book") && !qName.equals("bookstore")){
System.out.println("节点名是:"+qName);
}
}
/**
* 用于获取节点名对应的节点值
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
//使用String(byte[] bytes,int offset,int length)构造方法把字符数组传递进去
String value = new String(ch, start, length);
/**
* 因为characters解析时会把多余空格一起解析,造成输出多余空格,
* 用trim方法去除空格后,并且不等于空格后才进行输出
*/
if(!value.trim().equals("")){
System.out.println(value);
}
}
/**
* 解析XML的结束标签
*/
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
}
/**
* 用来标识解析xml文档的开始
*/
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX开始解析XML");
}
/**
* 用来标识解析xml文档的结束
*/
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析XML完成");
}
}
package com.imooc.io;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class SAXtest {
public static void main(String[] args){
//通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//SAXParseFactory实例的newSAXParse()方法返回SAXParser实例parser
SAXParser parser = factory.newSAXParser();
//创建SAXHandler的对象
SAXHandler handler = new SAXHandler();
parser.parse("demo.xml", handler);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果为:
SAX开始解析XML
book元素第1个属性名是:id
book元素第1个属性值是:1
节点名是:name
放学后
节点名是:author
lcb
节点名是:year
2010
节点名是:price
25
book元素第1个属性名是:id
book元素第1个属性值是:2
节点名是:name
你的孤独,虽败犹荣
节点名是:author
刘同
节点名是:year
2011
节点名是:price
30
SAX解析XML完成