Android中數(shù)據(jù)解析的五種方式
這里有一份XML文件,接下來(lái)我們用不同的解析方式來(lái)解析這份文件
<?xml version="1.0" encoding="UTF-8"?>
<Movies>
<Movie id="1">
<name>憤怒的小鳥(niǎo)</name>
<type>Animation</type>
<year>2016</year>
</Movie>
<Movie id="2">
<name>葉問(wèn)3</name>
<type>Action</type>
<language>English</language>
</Movie>
</Movies>
1.DOM解析
//1.創(chuàng)建一個(gè)DocumentBuilderFactory對(duì)象
DocumentBuilderFactory dBuilderFactory=DocumentBuilderFactory.newInstance();
try {
//2.創(chuàng)建一個(gè)DocumentBuilder對(duì)象
DocumentBuilder dBuilder=dBuilderFactory.newDocumentBuilder();
//3.獲取Document對(duì)象
Document document=dBuilder.parse("Movie.xml");
System.out.println("解析開(kāi)始:--------------------------");
//獲取Movie元素結(jié)點(diǎn)集合
NodeList movies=document.getElementsByTagName("Movie");
System.out.println("共有"+movies.getLength()+"部電影");
//遍歷Movie元素結(jié)點(diǎn)集合
for(int i=0;i<movies.getLength();i++){
System.out.println("=====================");
System.out.println("正在解析"+(i+1)+"部電影!");
Node movie=movies.item(i);
//獲取元素結(jié)點(diǎn)的屬性集合
NamedNodeMap attrs=movie.getAttributes();
for(int j=0;j<attrs.getLength();j++){
Node attr=attrs.item(j);
System.out.print("屬性名為:"+attr.getNodeName()+" ");
System.out.println("屬性值為:"+attr.getNodeValue());
}
//獲取movie元素子節(jié)點(diǎn)集合
NodeList childNodes=movie.getChildNodes();
for(int k=0;k<childNodes.getLength();k++){
Node child=childNodes.item(k);
if (child.getNodeType()==Document.ELEMENT_NODE) {
System.out.println("節(jié)點(diǎn)名:"+child.getNodeName()+" ");
//System.out.println("節(jié)點(diǎn)值:"+child.getNodeValue());
System.out.println("節(jié)點(diǎn)值:"+child.getFirstChild().getNodeValue());
}
}
System.out.println("第"+(i+1)+"部電影解析結(jié)束");
}
System.out.println("解析結(jié)束--------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
2.SAX解析
//1.創(chuàng)建SAXFactory對(duì)象
SAXParserFactory sParserFactory=SAXParserFactory .newInstance();
//2.拿到一個(gè)SAXParser解析對(duì)象
try {
SAXParser saxParser=sParserFactory.newSAXParser();
saxParser.parse("Movie.xml",new MyHandler() );
} catch (Exception e) {
e.printStackTrace();
}
接下來(lái)需要寫一個(gè)類去繼承DefaultHandler,然后一般要重寫里面的五個(gè)方法:
1)startDocument(),該方法一執(zhí)行表示解析開(kāi)始,可以在里面去初始化對(duì)象集合
@Override
public void startDocument() throws SAXException {
System.out.println("開(kāi)始解析----------------------------");
movieList=new ArrayList<>();
}
2)startEnement(),該方法一執(zhí)行表示解析到了開(kāi)始元素,亦即xml文件里面的Movie標(biāo)簽
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//
if ("Movie".equals(qName)) {
movie=new Movie();
count++;
System.out.println("正在解析第"+count+"部電影!");
for (int i = 0; i < attributes.getLength(); i++) {
//拿到屬性名和屬性值
System.out.print("屬性名:"+attributes.getQName(i)+" ");
System.out.println("屬性值:"+attributes.getValue(i));
if (attributes.getQName(i).equals("id")) {
movie.setMovieId(attributes.getValue(i));
}
}
}
}
3)characters(),在該方法里面去讀取元素的值
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
value=new String(ch,start,length);
if (!value.trim().equals("")) {
System.out.println("節(jié)點(diǎn)值:"+value);
}
}
4)endElement(),表示解析到了一個(gè)元素的結(jié)束標(biāo)簽,在該方法里面可以去 構(gòu)造對(duì)象,最后并且添加到集合里去
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("year")) {
movie.setMovieYear(value);
}
if (qName.equals("type")) {
movie.setMovieType(value);
}
if (qName.equals("language")) {
movie.setMovieLanguage(value);
}
if (qName.equals("name")) {
movie.setMovieName(value);
}
//解析完一個(gè)元素時(shí)回調(diào)
if ("Movie".equals(qName)) {
movieList.add(movie);
movie=null;
System.out.println("第"+count+"部電影解析結(jié)束!");
}
}
5)endDocument(),當(dāng)執(zhí)行到該方法也就表示文件已經(jīng)解析完畢了
@Override
public void endDocument() throws SAXException {
System.out.println("解析結(jié)束----------------------------");
System.out.println("解析結(jié)果集如下:");
for(int i=0;i<movieList.size();i++){
System.out.println(movieList.get(i).toString());
System.out.println("----------------------------------");
}
}
3.PULL解析
pull解析與其它方式不同的是,它需要將xml文件存放在資源文件res下面的xml文件夾下,解析的過(guò)程如下:
1)首先拿到一個(gè)Pull資源解析器,有時(shí)如果通過(guò)網(wǎng)絡(luò)上下載xml文件的話,則需要去構(gòu)造一個(gè)Pull解析器,再將流設(shè)置給pull解析器, 接下來(lái)就是一樣的,一個(gè)標(biāo)簽一個(gè)標(biāo)簽的去解析
//拿到一個(gè)XMLResourceParser
//XmlPullParser parser=Xml.newPullParser();
//parser.setInput(in);
XmlResourceParser xmlResourceParser=getResources().getXml(R.xml.movie);
//拿到第一個(gè)事件類型,也就是最外層的標(biāo)簽
try {
int type=xmlResourceParser.getEventType();
while(type!=XmlResourceParser.END_DOCUMENT){
if (type==XmlResourceParser.START_DOCUMENT) {
System.out.println("開(kāi)始解析");
movieList=new ArrayList<>();
}
if (type==XmlResourceParser.START_TAG) {
if ("Movie".equals(xmlResourceParser.getName())) {
movie=new Movie();
String id=xmlResourceParser.getAttributeValue(null, "id");
System.out.println("id:"+id);
movie.setMovieId(id);
}
if ("name".equals(xmlResourceParser.getName())) {
//System.out.println("name:"+xmlResourceParser.nextText()+"===========");
movie.setMovieName(xmlResourceParser.nextText());
}else if ("type".equals(xmlResourceParser.getName())) {
movie.setMovieType(xmlResourceParser.nextText());
}else if ("year".equals(xmlResourceParser.getName())) {
movie.setMovieYear(xmlResourceParser.nextText());
}else if ("language".equals(xmlResourceParser.getName())) {
movie.setMovieLanguage(xmlResourceParser.nextText());
}
}
if (type==XmlResourceParser.END_TAG) {
if ("Movie".equals(xmlResourceParser.getName())) {
movieList.add(movie);
movie=null;
}
}
type=xmlResourceParser.next();
}
System.out.println("解析結(jié)束");
StringBuffer sBuffer=new StringBuffer();
for (int i = 0; i < movieList.size(); i++) {
sBuffer.append(movieList.get(i).toString())
.append("\n");
}
show_tv.setText(sBuffer.toString());
} catch (Exception e) {
e.printStackTrace();
}
4.Json解析
Json解析的話需要先給出一份JSon數(shù)據(jù),就拿下面的數(shù)據(jù)來(lái)解析吧!
private static final String JSONDATA="{name:張三,"
+ "age:26,"
+ "phone:[131,132],"
+ "score:{"
+ "語(yǔ)文:100,"
+ "數(shù)學(xué):90,"
+ "理綜:{化學(xué):80,物理:70,生物:80}}}";
Json解析的過(guò)程無(wú)疑就是碰到大括號(hào),就new一個(gè)Object出來(lái),中括號(hào)就new一個(gè)Array出來(lái),再用一個(gè)for循環(huán)去讀取數(shù)據(jù):
StringBuffer stringBuffer=new StringBuffer();
try {
//JSONObject jsonObject=new JSONObject(JSONDATA);
JSONTokener jsonTokener=new JSONTokener(JSONDATA);
JSONObject jsonObject=(JSONObject) jsonTokener.nextValue();
stringBuffer.append("name:"+jsonObject.getString("name")+"\n");
stringBuffer.append("aeg:"+jsonObject.getString("age")+"\n");
JSONArray phoneArray=jsonObject.getJSONArray("phone");
stringBuffer.append("phone:"+phoneArray.getString(0)
+" "+phoneArray.getString(1)+"\n");
JSONObject scoreJsonObject=jsonObject.getJSONObject("score");
stringBuffer.append("語(yǔ)文:"+scoreJsonObject.getString("語(yǔ)文")+"\n")
.append("數(shù)學(xué):"+scoreJsonObject.getString("數(shù)學(xué)"));
JSONObject lizongObject=scoreJsonObject.getJSONObject("理綜");
stringBuffer.append("化學(xué):"+lizongObject.getString("化學(xué)")+"\n")
.append("物理:"+lizongObject.getString("物理")+"\n")
.append("生物:"+lizongObject.getString("生物"));
show_tv.setText(stringBuffer.toString());
} catch (Exception e) {
e.printStackTrace();
}
5.GSON解析
GSON解析相對(duì)來(lái)說(shuō)簡(jiǎn)單一些,但也有一定的局限性,比如說(shuō),數(shù)據(jù)類的屬性字段和key值必須是一一對(duì)應(yīng)的
//拿GSON去解析數(shù)據(jù)時(shí),數(shù)據(jù)類的屬性值跟key值必須是對(duì)應(yīng)的
Gson gson=new Gson();
Student student=gson.fromJson(JSONDATA, Student.class);
數(shù)據(jù)類的屬性:
public String name;
public String age;
public ArrayList<String> phone=new ArrayList<>();
public ArrayList<Score> score=new ArrayList<>();
public class Score{
public String id;
public String fenshu;
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- Android獲取當(dāng)前應(yīng)用分配的最大內(nèi)存和目前使用內(nèi)存的方法
- Android手機(jī)獲取Mac地址的幾種方法
- Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法
- Android調(diào)試神器stetho使用詳解和改造
- Android Java調(diào)用自己C++類庫(kù)的實(shí)例講解
- Android可自定義神奇動(dòng)效的卡片切換視圖實(shí)例
- Android添加音頻的幾種方法
- Android線程中Handle的使用講解
- Android亮屏速度分析總結(jié)
- Android四大組件之Service詳解
相關(guān)文章
Android4.0.x Home鍵事件攔截監(jiān)聽(tīng)的方法
這篇文章主要介紹了Android4.0.x Home鍵事件攔截監(jiān)聽(tīng)的方法,對(duì)比分析了2.3.x的實(shí)現(xiàn)方法,分析了4.0.x實(shí)現(xiàn)Home鍵事件攔截監(jiān)聽(tīng)的相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android 吸入動(dòng)畫(huà)效果實(shí)現(xiàn)分解
如何在Android上面實(shí)現(xiàn)一個(gè)類似的效果。先看看我實(shí)現(xiàn)的效果圖,我們利用了Canvas.drawBitmapMesh()方法,具體實(shí)現(xiàn)代碼如下,感興趣的朋友可以參考下哈2013-06-06
Android實(shí)現(xiàn)可收縮和擴(kuò)展的TextView
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可收縮和擴(kuò)展的TextView,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android自定義View實(shí)現(xiàn)水平帶數(shù)字百分比進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)水平帶數(shù)字百分比進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android基于自帶的DownloadManager實(shí)現(xiàn)下載功能示例
這篇文章主要介紹了Android基于自帶的DownloadManager實(shí)現(xiàn)下載功能,結(jié)合實(shí)例形式分析了DownloadManager實(shí)現(xiàn)下載功能的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08
Android頂部(toolbar)搜索框?qū)崿F(xiàn)的實(shí)例詳解
這篇文章主要介紹了Android頂部(toolbar)搜索框?qū)崿F(xiàn)的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-09-09
Android實(shí)現(xiàn)實(shí)時(shí)滑動(dòng)ViewPager的2種方式
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)實(shí)時(shí)滑動(dòng)ViewPager的2種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Flutter?文字中劃線動(dòng)畫(huà)StrikeThroughTextAnimation
這篇文章主要為大家介紹了Flutter?文字中劃線動(dòng)畫(huà)StrikeThroughTextAnimation示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

