Android学习笔记036之网络数据解析Word文档下载推荐.docx
《Android学习笔记036之网络数据解析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android学习笔记036之网络数据解析Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
![Android学习笔记036之网络数据解析Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-2/5/212cce83-9065-4d9f-b85c-a16e8f24f119/212cce83-9065-4d9f-b85c-a16e8f24f1191.gif)
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<
CarModel>
mCarModels=newArrayList<
>
();
privatestaticStringTAG="
SAXHandler"
;
privateStringresult;
@Override
publicvoidstartDocument()throwsSAXException{
super.startDocument();
Log.i(TAG,"
------>
startDocument"
);
}
publicvoidendDocument()throwsSAXException{
super.endDocument();
endDocument"
*读到第一个元素标签开始的时候调用
*
*@paramuri命名空间的URI
*@paramlocalName元素标签名
*@paramqName限定元素名
*@paramattributes附加在元素上的属性
*@throwsSAXException
publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{
super.startElement(uri,localName,qName,attributes);
if(localName.equals("
car"
)){
startElement"
mCarModel=newCarModel();
}
*元素标签结束的时候回调
*@paramqName限定元素名称
publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{
super.endElement(uri,localName,qName);
car_name"
mCarModel.setCar_name(result);
}elseif(localName.equals("
car_color"
mCarModel.setCar_color(result);
car_pice"
mCarModel.setCar_pice(result);
endElement"
System.out.println("
----->
"
+mCarModel);
mCarModels.add(mCarModel);
mCarModel=null;
*获取到元素节点的内容
*@paramch字符
*@paramstart字符数组起始位置
*@paramlength字符数组长度
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
super.characters(ch,start,length);
result=newString(ch,start,length);
publicList<
getCarModels(){
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<
mCarModels.size();
i++){
buffer.append("
车名:
buffer.append(mCarModels.get(i).getCar_name()+"
"
颜色:
buffer.append(mCarModels.get(i).getCar_color()+"
价格:
buffer.append(mCarModels.get(i).getCar_pice()+"
元"
\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方式解析数据:
privateStringparserDom(){
List<
modelList=newArrayList<
//1、通过DocumentBuilderFactory.newInstance()创建一个DocumentBuilderFactory对象实例
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
//2、通过factory.newDocumentBuilder()创建一个DocumentBuilder对象实例
DocumentBuilderbuilder=factory.newDocumentBuilder();
//3、将需要解析的文档加载到内存中
Documentdocument=builder.parse(getAssets().open("
));
//4、获取到根节点
Elementroot=document.getDocumentElement();
//5、获取根节点的所有子节点列表
NodeListrootList=root.getElementsByTagName("
//6、开始读取需要的节点
rootList.getLength();
CarModelmodel=newCarModel();
Nodecar=rootList.item(i);
NodeListchildList=car.getChildNodes();
for(intj=0;
j<
childList.getLength();
j++){
NodechildNode=childList.item(j);
//判断子节点类型是否是元素节点
if(childNode.getNodeType()==Node.ELEMENT_NODE){
ElementchildName=(Element)childNode;
StringnodeName=childName.getNodeName();
if(nodeName.equals("
model.setCar_name(childName.getFirstChild().getNodeValue());
}elseif(nodeName.equals("
model.setCar_color(childName.getFirstChild().getNodeValue());
model.setCar_pice(childName.getFirstChild().getNodeValue());
modelList.add(model);
使用DOM方式解析"
).append("
modelList.size();
buffer.append(modelList.get(i).getCar_name()+"
buffer.append(modelList.get(i).getCar_color()+"
buffer.append(modelList.get(i).getCar_pice()+"
实现的效果图
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对象实例,有两种方式:
XmlPullParserpullParser=Xml.newPullParser();
CarModelmodel=null;
//2、得到文件流,设置输出方式
pullParser.setInput(getAssets().open("
),"
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("
model=newCarModel();
}elseif(name.equals("
model.setCar_name(pullParser.nextText());
model.setCar_color(pullParser.nextText());
model.setCar_pice(pullParser.nextText());
break;
caseXmlPullParser.END_TAG:
model=null;
eventType=pullParser.next();
使用PULL方式解析"
for(inti=0