溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Xml格式數(shù)據(jù)如何生成和解析

發(fā)布時(shí)間:2021-09-17 14:46:18 來(lái)源:億速云 閱讀:137 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“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è)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

xml
AI