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实现类代码如下,样例:


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