今天電面又被虐了舔示,綜合上一次的面試碟婆,反思一下,雖然最近在準備面試惕稻,但是對很多東西都不思其解竖共,深度不夠。虐得我對生活喪失信心俺祠,要好好準備基礎(chǔ)公给。
其中問到xml的解析方式及其原理,原理蜘渣?淌铐? 一臉蒙蔽。蔫缸。
Android xml解析常用方式:
java支持的兩種是SAX腿准、DOM兩種,Android內(nèi)置的Pull解析
- SAX (Simple API for XML) 是以從上往下的事件處理模式為核心拾碌,不需要讀入整個文檔吐葱,而是邊讀邊解析,所以無法回退校翔。事件驅(qū)動也就是回調(diào)的方式弟跑,實現(xiàn)接口。這里使用的是SAX2
(1) 文檔解析開始時調(diào)用startDocument()防症,進行一些預(yù)處理
(2) 遇到<元素標簽> 孟辑,調(diào)用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>
從上面可以看出兩個節(jié)點:<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) 讀到元素頭部后巫财,要獲取具體的值,調(diào)用charatcter(char[] ch, int start, int length)
String content = new String(ch,start,length);
(4)遇到結(jié)尾元素哩陕,endElement(String uri, String localName, String qName)
DOM
是將整個文檔讀入內(nèi)存平项,最后形成節(jié)點樹,好處是能夠重復(fù)讀悍及,還能實現(xiàn)增刪改成闽瓢,不足是當(dāng)文檔很大將會占用很大的內(nèi)存空間,只適合較小的文檔PULL方式:運行方式和SAX類似也是基于事件驅(qū)動心赶。但是pull讀取xml文件后觸發(fā)相應(yīng)的事件調(diào)用方法返回的是數(shù)字扣讼,而且對事件觸發(fā)還需要由自己實現(xiàn),不像SAX監(jiān)聽到元素的結(jié)束缨叫,可以隨時停止椭符。
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);//獲取當(dāng)前元素的屬性值
parser.nextText());//獲取當(dāng)前元素的下一個文本節(jié)點的值
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