xml 解析

作者: 三木仔 | 来源:发表于2016-08-17 00:29 被阅读58次

    今天电面又被虐了,综合上一次的面试,反思一下,虽然最近在准备面试,但是对很多东西都不思其解,深度不够。虐得我对生活丧失信心,要好好准备基础。

    其中问到xml的解析方式及其原理,原理?? 一脸蒙蔽。。

    Android xml解析常用方式:
    java支持的两种是SAX、DOM两种,Android内置的Pull解析

    1. SAX (Simple API for XML) 是以从上往下的事件处理模式为核心,不需要读入整个文档,而是边读边解析,所以无法回退。事件驱动也就是回调的方式,实现接口。这里使用的是SAX2

    (1) 文档解析开始时调用startDocument(),进行一些预处理

    (2) 遇到<元素标签> ,调用startElements(String uri, String localname, String qname, Attributes attrs)
    uri是命名空间,localname是前缀,qname是标签名字,atts是属性集合

        <website id = "1">
          xmlns:baidu="http://www.baidu.com">
        <baidu:website baidu:blog="hi.baidu.com">百度</baidu:website>  
        </website>
    

    从上面可以看出两个节点:<website> <baidu:website>
    对于 website中,uri为null,localname为website,qname也为website,可从attrs获取和getQname(0)为“id”和getValue(0)为id的值;

    对于baidu:website中,uri为“http:// www.baidu.com",localname为”website“,qname为”baidu:website“
    其中attrs中也可以获取getLocalname(0)为”blog“,getQname(0)为”baidu:blog“, getURI(0)为"http:// www.baidu.com",getValue(0)为"hi.baidu.com"

    (3) 读到元素头部后,要获取具体的值,调用charatcter(char[] ch, int start, int length)
    String content = new String(ch,start,length);

    (4)遇到结尾元素,endElement(String uri, String localName, String qName)

    1. DOM
      是将整个文档读入内存,最后形成节点树,好处是能够重复读,还能实现增删改成,不足是当文档很大将会占用很大的内存空间,只适合较小的文档

    2. PULL方式:运行方式和SAX类似也是基于事件驱动。但是pull读取xml文件后触发相应的事件调用方法返回的是数字,而且对事件触发还需要由自己实现,不像SAX监听到元素的结束,可以随时停止。

    XmlPullParser parser =Xml.newPullParser();  //获取解析器
    parser.setInput(is, "UTF-8");// 输入流 、编码方式
    int eventType = parser.getEventType();  
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {  
            case XmlPullParser.START_DOCUMENT:  
                //文件开始
                break;
            case XmlPullParser.START_TAG: 
                parser.getName();//获取前指向的元素名称
                parser.getAttributeValue(int i);//获取当前元素的属性值
                parser.nextText());//获取当前元素的下一个文本节点的值  
                break;  
            case XmlPullParser.END_TAG: 
                break;
        }
        eventType = parser.next();  
    }
    

    参考文章:
    http://blog.csdn.net/wssiqi/article/details/8239357
    http://blog.csdn.net/liuhe688/article/details/6415593

    相关文章

      网友评论

        本文标题:xml 解析

        本文链接:https://www.haomeiwen.com/subject/meopsttx.html