您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Xml格式數(shù)據(jù)如何生成和解析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Xml格式數(shù)據(jù)如何生成和解析”這篇文章吧。
1. Xml格式數(shù)據(jù)的生成和解析
使用xml 作為數(shù)據(jù)交互的載體是Android中非常重要的功能,比如天氣預(yù)報(bào)數(shù)據(jù)、短信備份數(shù)據(jù)、訊錄數(shù)據(jù)都可以以xml
的格式通過(guò)網(wǎng)絡(luò)傳輸。
XML的格式通過(guò)便簽的形式書(shū)寫(xiě)和展示,一目了然,方便閱讀和識(shí)別,如下所示:
<xml 頭> <student> <name>張三</name> <number>110001</number> <sex>male</sex> </student>
XML的生成
如果用java代碼去實(shí)現(xiàn)這樣的一個(gè)字符串格式,可以使用到StringBuilder來(lái)進(jìn)行組拼:StringBuilder sb = new StringBuilder();
//數(shù)據(jù)保存到文件 sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); sb.append("<student>"); sb.append("<name>"); sb.append(name); sb.append("</name>"); sb.append("<number>"); sb.append(number); sb.append("</number>"); sb.append("<sex>"); sb.append(sex); sb.append("</sex>"); sb.append("</student>");
上面的代碼雖然也可以生成xml
文件,但是無(wú)法對(duì)特殊字符進(jìn)行處理,比如如果短信內(nèi)容包含“</>”符號(hào),那么xml
解析器就無(wú)法完成正確的解析。因此使用的前提是你確定數(shù)據(jù)內(nèi)容沒(méi)有特殊字符。
而Android為我們提供了一個(gè)專(zhuān)門(mén)用于生成XML數(shù)據(jù)的API:XmlSerializer, 該api
內(nèi)部已經(jīng)實(shí)現(xiàn)了對(duì)特殊字符的處理,代碼如下:
try {// 采用Android的api面向?qū)ο蟮纳蓌ml文件. // 1.得到xml文件的序列化器 XmlSerializer serializer = Xml.newSerializer(); // 2.指定序列化器的一些初始參數(shù) File file = new File(getFilesDir(), name +".xml"); FileOutputStream os = new FileOutputStream(file);serializer.setOutput(os, "utf-8"); // 3.寫(xiě)xml文件. serializer.startDocument("utf-8", true);//寫(xiě)開(kāi)頭serializer.startTag(null, "student");//開(kāi)始標(biāo)簽 serializer.startTag(null,"name"); serializer.text(name);//文本標(biāo)簽 serializer.endTag(null,"name");//結(jié)束標(biāo)簽 serializer.startTag(null,"number"); serializer.text(number); serializer.endTag(null,"number"); serializer.startTag(null,"sex"); serializer.text(sex); serializer.endTag(null,"sex"); serializer.endTag(null,"student"); serializer.endDocument();//寫(xiě)結(jié)尾 os.close(); Toast.makeText(this,"保存數(shù)據(jù)成功", 0).show(); } catch (Exception e) {e.printStackTrace(); Toast.makeText(this,"保存數(shù)據(jù)失敗", 0).show(); }
XML的解析
1. DOM解析
是一種基于對(duì)象的API,它會(huì)將XML文件的所有內(nèi)容以文檔樹(shù)方式存放在內(nèi)存中,然后允許使用DOMAPI遍歷XML樹(shù)、檢索所需的數(shù)據(jù),這樣便能根據(jù)樹(shù)的結(jié)構(gòu)以節(jié)點(diǎn)形式來(lái)對(duì)文件進(jìn)行操作。由于DOM需要將整個(gè)XML文件以文檔樹(shù)的形式存放在內(nèi)存中,消耗內(nèi)存比較大,在Android下不介意使用該種方式進(jìn)行解析。
2. SAX解析
會(huì)逐行掃描XML文檔,當(dāng)遇到標(biāo)簽時(shí)觸發(fā)解析處理器,采用事件處理的方式解析XML。它在讀取文檔的同時(shí)即可對(duì)XML進(jìn)行處理,不必等到文檔加載結(jié)束,相對(duì)快捷,而且也不需要將整個(gè)文檔加載進(jìn)內(nèi)存,因此不存在占用內(nèi)存的問(wèn)題,可以解析超大XML。但是,SAX解析只能用來(lái)讀取XML的數(shù)據(jù),無(wú)法進(jìn)行增刪改。
3. PULL解析跟SAX解析類(lèi)似,也是基于事件處理的方式。PULL解析器是一個(gè)開(kāi)源的Java項(xiàng)目,既可以用于Android應(yīng)用,也可以用與JavaEE程序。Android已經(jīng)集成了PULL解析器,因此,在android中最常用的解析方式就是PULL解析。
SAX和PULL解析對(duì)比:Pull 解析器的運(yùn)行方式與SAX
解析器相似,都屬于事件驅(qū)動(dòng)模式。它提供了類(lèi)似的事件,如:開(kāi)始元素和結(jié)束元素事件,使用parser.next()可以進(jìn)入下一個(gè)元素并觸發(fā)相應(yīng)事件。事件將作為數(shù)值代碼被發(fā)送,因此可以使用一個(gè)switch
對(duì)感興趣的事件進(jìn)行處理。當(dāng)元素開(kāi)始解析時(shí),調(diào)用parser.nextText()方法可以獲取下一個(gè)Text
類(lèi)型元素的值。
SAX 解析器的工作方式是自動(dòng)將事件推入事件處理器進(jìn)行處理,因此你不能控制事件的處理主動(dòng)結(jié)束;而Pull
解析器的工作方式為允許你的應(yīng)用程序代碼主動(dòng)從解析器中獲取事件,正因?yàn)槭侵鲃?dòng)獲取事件,因此可以在滿(mǎn)足了需要的條件后不再獲取事件,結(jié)束解析。
Android下使用PULL方式解析XML文件的代碼如下:
try {//學(xué)生信息的xml文件存在 //1.獲取到一個(gè)xml解析器 XmlPullParser parser = Xml.newPullParser(); //2.設(shè)置解析器的初始化參數(shù) FileInputStream inputStream = new FileInputStream(file);parser.setInput(inputStream, "utf-8"); //3.解析xml文件 int type = parser.getEventType();//得到第一個(gè)事件的類(lèi)型. System.out.println("type:"+type); StringBuilder sb = new StringBuilder();//當(dāng)事件類(lèi)型不是文檔的結(jié)尾則一直遍歷每一個(gè)節(jié)點(diǎn) while(type!=XmlPullParser.END_DOCUMENT){if(type==XmlPullParser.START_TAG){ //開(kāi)始節(jié)點(diǎn) //判斷節(jié)點(diǎn)的名稱(chēng) if("name".equals(parser.getName())){String nameStr = parser.nextText(); System.out.println("姓名:"+nameStr); sb.append("姓名:"+nameStr+"\n"); }else if("number".equals(parser.getName())){String numberStr = parser.nextText(); System.out.println("學(xué)號(hào):"+numberStr); sb.append("學(xué)號(hào):"+numberStr+"\n"); }else if("sex".equals(parser.getName())){String sexStr = parser.nextText(); System.out.println("性別:"+sexStr); sb.append("性別:"+sexStr+"\n"); } } type = parser.next();//獲取下一個(gè)事件類(lèi)型 System.out.println("type:"+type); } inputStream.close();//浪費(fèi)資源 造成內(nèi)存泄漏! tv_result.setText(sb.toString()); } catch (Exception e) {e.printStackTrace(); Toast.makeText(this,"解析學(xué)生信息失敗", 0).show(); }
以上是“Xml格式數(shù)據(jù)如何生成和解析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。