與DOM方式不同的是,SAX是使用一個Handler類來完成解析XML文件的。
創建一個SAXParserFactory對象。
SAXParserFactory factory = SAXParserFactory.newInstance();
利用SAXParserFactory對象來創建一個SAXParser對象。
SAXParser parser = factory.newSAXParser();
創建一個繼承DefaultHandler的類, 並重寫DefaultHandler類中的startElement()方法、endElement()方法、startDocument()方法和endDocument()方法。
public class SAXParserHandler extends DefaultHandler {
//遍歷XML文件遇到開始標籤時調用
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//遍歷節點中的所有屬性
int attrLength = attributes.getLength(); //獲取屬性個數
for(int i = 0; i < attrLength; i++){
String attrName = attributes.getQName(i); //根據索引值去獲取屬性名
String attrValue = attributes.getValue(i); //根據索引值去獲取屬性值
}
//遍歷所有節點的節點名
String nodeName = qName;
}
//遍歷XML文件遇到結束標籤時調用
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
}
//解析XML文件開始時調用
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
//解析XML文件結束時調用
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
}
而要獲得節點的值需要重寫DefaultHandler類中的characters()方法。
其中參數 ch 爲整個XML文件中所有內容, 而 start 爲節點內容的起始位置, length 爲內容長度。start 會在startElement()方法中獲取並記錄, length 則會在endElement()方法中獲取並記錄,所以每次調用characters()方法時得到的就是節點的內容。
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String nodeValue = new String(ch, start, length);
}
創建一個SAXParserHandler對象。
SAXParserHander handler = new SAXParserHander();
通過SAXParser對象的parse()方法來加載XML文件。
parser.parse("File.xml", handler); //File.xml爲XML文件的路徑
和DOM方式一樣,以上僅僅簡單的獲取了XML文件中的屬性名、屬性值、節點名和節點值。
Keep Going…