Android学习笔记036之网络数据解析资料.docx
- 文档编号:29191571
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:25
- 大小:115.38KB
Android学习笔记036之网络数据解析资料.docx
《Android学习笔记036之网络数据解析资料.docx》由会员分享,可在线阅读,更多相关《Android学习笔记036之网络数据解析资料.docx(25页珍藏版)》请在冰豆网上搜索。
Android学习笔记036之网络数据解析资料
Android学习笔记036之网络数据解析
前面我们介绍了HTTP协议和Android中通过HTTP协议通信的两种方式:
HttpUrlConnection和HttpClient,这些都只是在协议层的,数据在网络中传递需要有一定的格式才能被识别的解析,目前,常用的有XML和JSON,那么这一篇,我们来学习一下XML数据和JSON数据的解析:
1、XML数据解析
XML不仅仅在Android中常用,在各种应用中也广泛使用,是承载数据的一个重要角色。
作为一个Android开发者,我们需要学会在Android中读写XML数据,下面我们开始学习一下XML数据的解析吧!
1.1、XML数据简介
XML是可扩展标记语言(ExtensibleMarkupLanguage)的缩写,其中的标记(markup)是关键部分。
您可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。
您创建的文件,或文档实例由元素(标记)和内容构成。
当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档。
元素的描述性越强,文档各部分越容易识别。
在这里就不在做很深入的学习了,我们只需要知道,XML可以用来存储数据,可以将XML当成是一个小型的数据库,前面我们学习Android数据存储的时候,学习到的SharedPreference存储方式中,底层存储数据就是通过XML的形式。
XML数据解析方式有三种,分别是SAX方式、DOM方式、PULL方式,那么我们开始学习一下这三种方式解析XML数据吧!
1.2、SAX方式解析XML数据
SAX(SimpleAPIforXML)解析器是一个基于事件的解析方式,由事件流驱动,从文档的顺序开始到文档结束,中间不可以回退或者暂停。
SAX解析器解析速度快,占用内存少,非常适合在Android端使用。
SAX解析器的解析原理就是:
对文档进行顺序扫描,当扫描到文档开始,元素开始和结束,文档结束等地方时通知事件处理函数,事件处理函数做出相应处理之后继续扫描,直到文档扫描结束。
常用的SAX接口和类:
Attrbutes:
用于得到属性的个数、名字和值。
ContentHandler:
定义与文档本身关联的事件(例如,开始和结束标记)。
大多数应用程序都注册这些事件。
DTDHandler:
定义与DTD关联的事件。
它没有定义足够的事件来完整地报告DTD。
如果需要对DTD进行语法分析,请使用可选的DeclHandler。
DeclHandler是SAX的扩展。
不是所有的语法分析器都支持它。
EntityResolver:
定义与装入实体关联的事件。
只有少数几个应用程序注册这些事件。
ErrorHandler:
定义错误事件。
许多应用程序注册这些事件以便用它们自己的方式报错。
DefaultHandler:
它提供了这些接LI的缺省实现。
在大多数情况下,为应用程序扩,DefaultHandler并覆盖相关的方法要比直接实现一个接口更容易。
SAX解析器的使用步骤:
1、通过SAXParserFactory.newInstance()创建一个SAXParserFactory对象
2、通过SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
3、实例化一个DefaultHandler对象
4、将第二步创建的SAXParser分配给解析器,对文档进行解析,将事件发送给处理器
下面我们通过一个简单的例子体会一下SAX解析XML数据:
首先是SAXHandler代码:
packagecom.example.datasave;
importandroid.util.Log;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
importjava.util.ArrayList;
importjava.util.List;
/**
*CreatedbyDevinon2016/7/25.
*/
publicclassSAXHandlerextendsDefaultHandler{
privateCarModelmCarModel;
privateList
privatestaticStringTAG="SAXHandler";
privateStringresult;
@Override
publicvoidstartDocument()throwsSAXException{
super.startDocument();
Log.i(TAG,"------>>startDocument");
}
@Override
publicvoidendDocument()throwsSAXException{
super.endDocument();
Log.i(TAG,"------>>endDocument");
}
/**
*读到第一个元素标签开始的时候调用
*
*@paramuri命名空间的URI
*@paramlocalName元素标签名
*@paramqName限定元素名
*@paramattributes附加在元素上的属性
*@throwsSAXException
*/
@Override
publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{
super.startElement(uri,localName,qName,attributes);
if(localName.equals("car")){
Log.i(TAG,"------>>startElement");
mCarModel=newCarModel();
}
}
/**
*元素标签结束的时候回调
*
*@paramuri命名空间的URI
*@paramlocalName元素标签名
*@paramqName限定元素名称
*@throwsSAXException
*/
@Override
publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{
super.endElement(uri,localName,qName);
if(localName.equals("car_name")){
mCarModel.setCar_name(result);
}elseif(localName.equals("car_color")){
mCarModel.setCar_color(result);
}elseif(localName.equals("car_pice")){
mCarModel.setCar_pice(result);
}elseif(localName.equals("car")){
Log.i(TAG,"------>>endElement");
System.out.println("----->>"+mCarModel);
mCarModels.add(mCarModel);
mCarModel=null;
}
}
/**
*获取到元素节点的内容
*
*@paramch字符
*@paramstart字符数组起始位置
*@paramlength字符数组长度
*@throwsSAXException
*/
@Override
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
super.characters(ch,start,length);
result=newString(ch,start,length);
}
publicList
returnmCarModels;
}
}
Activity代码:
btn_xml_sax=(Button)findViewById(R.id.btn_xml_sax);
btn_xml_sax.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
getCar();
System.out.println(parserSax());
tv_xml_sax.setText(parserSax());
}
});
privatevoidgetCar(){
//获取到需要解析的xml文件
InputStreaminputStream=null;
try{
inputStream=this.getAssets().open("car.xml");
//1、通过SAXParserFactory.newInstance()创建一个SAXParserFactory
SAXParserFactoryfactory=SAXParserFactory.newInstance();
//2、通过SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
SAXParserparser=factory.newSAXParser();
//3、实例化一个DefaultHandler对象
SAXHandlerhandler=newSAXHandler();
//4、将第二步创建的SAXParser分配给解析器,对文档进行解析,将事件发送给处理器
parser.parse(inputStream,handler);
inputStream.close();
mCarModels=handler.getCarModels();
}catch(Exceptione){
e.printStackTrace();
}
}
privateStringparserSax(){
StringBufferbuffer=newStringBuffer();
for(inti=0;i buffer.append("车名: "); buffer.append(mCarModels.get(i).getCar_name()+","); buffer.append("颜色: "); buffer.append(mCarModels.get(i).getCar_color()+","); buffer.append("价格: "); buffer.append(mCarModels.get(i).getCar_pice()+"元"); buffer.append("\n"); } returnbuffer.toString(); } 实现效果图: 这样就可以实现SAX方式解析XMl数据 1.3、DOM方式解析XML数据 DOM方式是将XML文档中的内容全部以树的方式加载到内存中,检索的时候需要将文档内容全部加载到内存中和构造树形结构完成之后才会开始,允许开发人员使用DOMAPI对文档进行读取、搜索、修改、添加和删除等操作。 DOM解析方式的原理: 使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档。 常用的DoM接口和类: Document: 该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。 Element: 该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。 Node: 该接口提供处理并获取节点和子节点值的方法。 NodeList: 提供获得节点个数和当前节点的方法。 这样就可以迭代地访问各个节点。 DOMParser: 该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。 DOM解析方式使用步骤: 1、通过DocumentBuilderFactory.newInstance()创建一个DocumentBuilderFactory对象实例 2、通过factory.newDocumentBuilder()创建一个DocumentBuilder对象实例 3、然后加载XML文档(Document) 4、然后获取文档的根结点(Element) 5、然后获取根结点中所有子节点的列表(NodeList) 6、然后使用再获取子节点列表中的需要读取的结点。 下面通过一个例子体会一下DOM方式解析数据: Activity代码: privateStringparserDom(){ List //1、通过DocumentBuilderFactory.newInstance()创建一个DocumentBuilderFactory对象实例 DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); try{ //2、通过factory.newDocumentBuilder()创建一个DocumentBuilder对象实例 DocumentBuilderbuilder=factory.newDocumentBuilder(); //3、将需要解析的文档加载到内存中 Documentdocument=builder.parse(getAssets().open("car.xml")); //4、获取到根节点 Elementroot=document.getDocumentElement(); //5、获取根节点的所有子节点列表 NodeListrootList=root.getElementsByTagName("car"); //6、开始读取需要的节点 for(inti=0;i CarModelmodel=newCarModel(); Nodecar=rootList.item(i); NodeListchildList=car.getChildNodes(); for(intj=0;j NodechildNode=childList.item(j); //判断子节点类型是否是元素节点 if(childNode.getNodeType()==Node.ELEMENT_NODE){ ElementchildName=(Element)childNode; StringnodeName=childName.getNodeName(); if(nodeName.equals("car_name")){ model.setCar_name(childName.getFirstChild().getNodeValue()); }elseif(nodeName.equals("car_color")){ model.setCar_color(childName.getFirstChild().getNodeValue()); }elseif(nodeName.equals("car_pice")){ model.setCar_pice(childName.getFirstChild().getNodeValue()); } } } modelList.add(model); } }catch(Exceptione){ e.printStackTrace(); } StringBufferbuffer=newStringBuffer(); buffer.append("使用DOM方式解析").append("\n").append("\n"); for(inti=0;i buffer.append("车名: "); buffer.append(modelList.get(i).getCar_name()+","); buffer.append("颜色: "); buffer.append(modelList.get(i).getCar_color()+","); buffer.append("价格: "); buffer.append(modelList.get(i).getCar_pice()+"元"); buffer.append("\n"); } returnbuffer.toString(); } 实现的效果图 1.4、PULL方式XML数据 Android并未提供对JavaStAXAPI的支持。 但是,Android附带了一个pull解析器,其工作方式类似于StAX。 它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反。 PULL解析器的运行方式和SAX类似,都是基于事件的模式。 不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。 PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。 PULL的工作原理: XMLpull提供了开始元素和结束元素。 当某个元素开始时,我们可以调用parser.nextText从XML文档中提取所有字符数据。 当解释到一个文档结束时,自动生成EndDocument事件。 常用的XMLPULL的接口和类: XmlPullParser: XMLpull解析器是一个在XMLPULLVlAP1中提供了定义解析功能的接口。 XmlSerializer: 它是一个接口,定义了XML信息集的序列。 XmlPullParserFactory: 这个类用于在XMPULLV1API中创建XMLPull解析器。 XmlPullParserException: 抛出单一的XMLpull解析器相关的错误。 使用PULL解析器解析的步骤: 1、1、创建一个XmlPullParser对象实例,有两种方式: Xml.newPullParser();通过XmlPullParserFactory.newInstance()获取到XmlPullParserFactory对象实例,然后通过factory.newPullParser()创建 2、得到文件流,设置输出方式 3、获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等事件 4、开始解析和获取数据 下面通过实例体会一下这种解析方式: privateStringparserPull(){ //1、创建一个XmlPullParser对象实例,有两种方式: Xml.newPullParser();通过XmlPullParserFactory.newInstance()获取到XmlPullParserFactory对象实例,然后通过factory.newPullParser()创建 XmlPullParserpullParser=Xml.newPullParser(); List CarModelmodel=null; try{ //2、得到文件流,设置输出方式 pullParser.setInput(getAssets().open("car.xml"),"UTF-8"); //3、获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等事件 inteventType=pullParser.getEventType(); Stringname=""; while(eventType! =XmlPullParser.END_DOCUMENT){ name=pullParser.getName(); switch(eventType){ caseXmlPullParser.START_DOCUMENT: eak; caseXmlPullParser.START_TAG: if(name.equals("car")){ model=newCarModel(); }elseif(name.equals("car_name")){ model.setCar_name(pullParser.nextText()); }elseif(name.equals("car_color")){ model.setCar_color(pullParser.nextText()); }elseif(name.equals("car_pice")){ model.setCar_pice(pullParser.nextText()); } break; caseXmlPullParser.END_TAG: if(name.equals("car")){ modelList.add(model); model=null; } break; } eventType=pullParser.next(); } }catch(Exceptione){ e.printStackTrace(); } StringBufferbuffer=newStringBuffer(); buffer.append("使用PULL方式解析").append("\n").append("\n"); for(inti=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 学习 笔记 036 网络 数据 解析 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)