先看例子代码:
MySax.java:
package mySax;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MySax {
public static void main(String[] args){
try{
SAXParserFactory factory = SAXParserFactory.newInstance(); //新建一个工厂类
SAXParser saxParser = factory.newSAXParser(); //从工厂类中提取出一个saxParser
InputStream is = new FileInputStream("res/phone.xml"); //将文件流化
saxParser.parse(is,new MyHandler()); //调用解析的方法
}catch(Exception e){
e.printStackTrace();
}
}
}
MyHandler.java:
package mySax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyHandler extends DefaultHandler {
//覆盖文档开始处理的方法
public void startDocument() throws SAXException {
System.out.println("开始处理xml文件");
}
//覆盖文档结束处理的方法
public void endDocument() throws SAXException {
System.out.println("结束处理xml文件");
}
//覆盖节点开始处理的方法
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("节点名" + qName + "开始");
if(attributes.getLength() > 0){
for(int i = 0;i < attributes.getLength();i ++){
System.out.println("属性" + i + ":" + attributes.getQName(i) + "它的值是" + attributes.getValue(i));
}
}
}
//覆盖节点之间字符处理的方法
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println("节点中的值" + new String(ch,start,length));
}
//覆盖节点结束处理的方法
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("节点名" + qName + "结束");
}
}
res/phone.xml文件:
<sonyericsson>
<phone id="Nokia_phone">
<name>Nokia</name>
<colour>black</colour>
</phone>
<phone id="moto_phone" type="good">
<name>motov300</name>
<color>blue</color>
</phone>
</sonyericsson>
这里我主要来讲一下MyHandler 的执行过程。
MyHandler是继承自类DefaultHandler ,然后我们可以覆盖DefaultHandler 类的方法。
MyHandler是一边读xml文件一边对xml文件进行解析的。
1.首先调用startDocument()宣布对xml文件开始处理。
2.当遇到开始节点时,调用startElement(String uri, String localName, String qName, Attributes attributes) 进行处理,attributes是该节点内的属性,我们也可以对这些属性进行相应的操作。
3.然后对开始节点后的字符进行处理,调用characters(char[] ch, int start, int length)方法。
4.当遇到结束节点时,调用endElement(String uri, String localName, String qName)进行处理。
5.然后对结束节点后的字符进行处理,调用characters(char[] ch, int start, int length)方法。
6.最后调用endDocument() 宣布对xml文件处理结束。
最后的输出结果是:
开始处理xml文件
节点名sonyericsson开始
节点中的值
属性0:id它的值是Nokia_phone
节点中的值
节点中的值Nokia
节点名name结束
节点中的值
节点中的值black
节点名colour结束
节点中的值
节点中的值
属性0:id它的值是moto_phone
属性1:type它的值是good
节点中的值
节点中的值motov300
节点名name结束
节点中的值
节点中的值blue
节点名color结束
节点中的值
节点中的值
结束处理xml文件
对照着XML文件看,很容易就能明白了。
我们也可以在方法中根据需求加入相应的处理。sax非常好用。