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完成