xml 解析

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

其中问到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是属性集合

    
      xmlns:baidu="http://www.baidu.com">
    百度  
    

从上面可以看出两个节点:
对于 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 解析)