android 知識點 之 xml解析

這裏用SAX 來解析:

SAX是採用一邊讀入數據一邊解析的方式,這樣可以很好的避免大文件解析的效率和性能問題(像什麼內存溢出之類的),但缺點就是插入不方便;

下面開始正題:

SAX 是讀取一個一個節點進行解析的, 如 :

<A>

    <B>123</B>

    <C>123</C>

</A>

<A>

   <B>234</B>

</A>

SAX startElement 方法 會先讀取第一個A標籤,找到A標籤的時候 會調用  實現SAX 類的characters方法 來讀取其中的內容, 當讀取的內容遇到標籤的時候

又會調用startElement 方法,這樣周而復始,知道把A標籤解析完, 然後開始解析第二個A標籤……


執行順序爲:

(1)startDocument  ---》(2)startElement  ---》(3)characters  ---》 (4)endElement ----》(5)endDocument

其中2-4 是可以被多步執行的;在startElement當中除了可以調用characters解析內容外 還可以從attributes裏面讀取屬性,

然後將值存入某個定義的變量中(如果有N個相同子元素子標籤的話, 要注意對每個子標籤值得轉存,以免數據被覆蓋)

/**
 * @author lfssay
 *這裏繼承DefaultHandler 就行了,實現ContentHandler要實現裏面所有的方法
 *通常只需要5個方法就能完事兒
 *
 *在解析的過程中,如果是相同標籤的並列, 會一個一個去解析,標籤的內容也只是在解析完該標籤期間有效
 *就是下面的定義標籤名稱,因爲在新的標籤解析當中, 如果有相同名稱標籤就會被覆蓋
 */
public class MyContentHandler extends DefaultHandler{
    // 定義標籤名稱
    String hisname,name,sex,status;
    String tageName;
    
    /**
     * 開始解析document
     */
    @Override
    public void startDocument() throws SAXException {
//        super.startDocument();
        System.out.println("----begin the anlysis document----");
    }
    
    /**
     * 結束解析document
     */
    @Override
    public void endDocument() throws SAXException {
//        super.endDocument();
        System.out.println("---end anlysis document----");
    }
    
    /**
     * 開始解析標籤
     * uri:命名空間
     * localName:不帶前綴的標籤名
     * qName:帶前綴的標籤名
     * attributes:屬性
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        tageName = localName;
        // 得到worker標籤的屬性值
        if(localName.equals("worker")){
            for(int i=0;i<attributes.getLength();i++){
                System.out.println("===keyValues:"+attributes.getLocalName(i)+"---"+attributes.getValue(i));
            }
        }
//        super.startElement(uri, localName, qName, attributes);
    }
    
    /**
     * 結束解析標籤
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if(localName.equals("worker")){
            output();
        }
//        super.endElement(uri, localName, qName);
    }
    
    /**
     * 得到標籤中間的內容
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(tageName.equals("name")){
            name = new String(ch,start,length);
        }else if(tageName.equals("sex")){
            sex = new String(ch,start,length);
        }else if(tageName.equals("status")){
            status = new String(ch,start,length);
        }
//        super.characters(ch, start, length);
    }
    
    public void output(){
        System.out.println("name is --"+name);
        System.out.println("sex is ---"+sex);
        System.out.println("status is --"+status);
    }


SAX實現類代碼如下,樣例:


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