使用SAX解析XML文件

與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…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章