今天电面又被虐了,综合上一次的面试,反思一下,虽然最近在准备面试,但是对很多东西都不思其解,深度不够。虐得我对生活丧失信心,要好好准备基础。
其中问到xml的解析方式及其原理,原理?? 一脸蒙蔽。。
Android xml解析常用方式:
java支持的两种是SAX、DOM两种,Android内置的Pull解析
- 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)
DOM
是将整个文档读入内存,最后形成节点树,好处是能够重复读,还能实现增删改成,不足是当文档很大将会占用很大的内存空间,只适合较小的文档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