android解析xml文件的方式--PULL

合集下载

Android高级技术11月考试试题及答案

Android高级技术11月考试试题及答案

Android高级技术11月考试试题及答案一、单选题(共33题,共62分)1、(2分)WebView中可以用来处理js中警示,确认等对话框的是(C)A.WebSettingsB.WebViewClientC.WebChromeClientD.WebView Chrome2、(2分)Android解析xml的方法中,将整个文件加载到内存中进行解析的是?(C)A、SAX B、PULL C、DOM D、JSON3、(2分)以下属于调用摄像头硬件的权限的是:(A)A.B.C.D.4、(1分)使用Android系统进行拍照用到的类有:(D) A.SurfaceView B.SurfaceHolder C.Callback D. Camera5、(2分)LocationManager获取位置信息的途径下列说法不正确的是(B)A,GPS定位更精确,缺点是只能在户外使用B,NETWORK通过基站和Wi-Fi信号来获取位置信息,速度较慢,耗电较少。

C,获取用户位置信息,我们可以使用其中一个,也可以同时使用两个。

D,GPS定位耗电严重,并且返回用户位置信息的速度远不能满足用户需求。

6、(2分)在开发AppWidget窗口小部件时,需要继承(D)类A,AppWidgetReceiverB,AppWidgetConfigureC,AppWidgetManagerD,AppWidgetProvider7、(4分)在AsyncTask中下列哪个方法是负责执行那些很耗时的后台计算工作的(C)A,runB,executeC,doInBackgroundD,onPostExecute8、(2分)如果希望自定义TabHost标题部分的显示内容需要使用下列哪个方法(B)finalTabHosttabHost=getTabHost(); A,tabHost.addTab(tabHost.newTabSpec("tab1")B,setIndicatorC,setContent();D,setView9、(2分)使用HttpUrlConnection实现移动互联时,设置读取超时属性的方法是(B)A、setTimeout()B、setReadTimeout()C、setConnectTimeout()D、setRequestMethod()10、(1分)使用HttpURLConnection的Get方式请求数据时,下列哪个属性是必须设置的(B)A,connection.setDoOutput(true)B,connection.connect()C,connection.setRequestMethod("POST")D,connection.setDoInput(true)11、(2分)AppWidget窗口小部件时不可以使用下列哪个布局(C) A,FrameLayoutB,LinearLayout C,TableLayout D,RelativeLayout12、(2分)下列哪个布局和组件是在开发AppWidget窗口小部件时不可以使用的(B)A,ImageViewB,WebView C,GridView D,Button13、(2分)假设assets目录下有文件结构html/hello.html,用loadUrl()方法将该网页加载至webView时,需传入的参数是(B)A,file:///asset/html/hello.htmlB,file:///android_asset/html/hello.htmlC,file:///androidasset/hello.htmlD,file:///assets/html/hello.html14、(2分)使用HttpClient的Get方式请求数据时,可以(C)类来构建Http请求A,GetB,URLConnectionC,HttpGetD,HttpPost15、(2分)若希望在点击网页中超链接时,在当前WebView中显示该网页,则需要覆盖WebViewClient类(A)方法。

Android利用Document实现xml读取和写入操作

Android利用Document实现xml读取和写入操作

Android利⽤Document实现xml读取和写⼊操作本⽂实例为⼤家分享了利⽤Document实现xml读取和写⼊操作,供⼤家参考,具体内容如下⾸先先来介绍⼀下什么xml?xml是可扩展标记语⾔,他可以⽤来标记数据,定义数据类型。

是⼀种允许⽤户对⾃⼰标记语⾔进⾏定义的源语⾔。

解析XML⽂件的⽅法有很多⽅法:dom解析,就是document以及PULL和SAX⽅法。

今天给⼤家分享⼀下如何⽤Document来操作XML。

效果图:⾸先先对布局⽂件进⾏操作:activity_main.xml:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.oak.d3_xml.MainActivity"><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="⽣成"android:id="@+id/bt_create"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="读取"android:id="@+id/bt_read"/></LinearLayout>主代码:MainActivity.java: 值得注意的是Document类中的包要导W3C的包package com.oak.d3_xml;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;public class MainActivity extends AppCompatActivity {private TextView textView;//⽤于展⽰读取xml的内容private Button bt_create;//⽤于创建xml⽂件private Button bt_read;//⽤于读取xml⽂件private File file;//xml⽂件路径@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);file = new File(getFilesDir(),"languages.xml");//获取到xml⽂件textView = (TextView) findViewById();//拿到textView控件bt_create = (Button) findViewById(R.id.bt_create);//拿到创建按钮bt_read = (Button) findViewById(R.id.bt_read);//拿到读取按钮bt_create.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//这⾥利⽤的是dom对xml进⾏操作的//实例化⼀个DocmentBuilderFactory,调⽤其静态⽅法获取DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();try {//实例化⼀个DocumentBuilderDocumentBuilder builder = builderFactory.newDocumentBuilder();//实例化⼀个xml⽂件Document newxml = builder.newDocument();//创建⼀个根标签Element languages = newxml.createElement("languages");//为其设置属性languages.setAttribute("cat","it");//for循坏3次,分别创建出三个标签,每个标签都包含内容for (int i=0;i<3;i++){//创建languages的⼦标签lanElement lan = newxml.createElement("lan");//设置属性lan.setAttribute("id",i+"");//创建lan的⼦标签Element name = newxml.createElement("name");//设置内容name.setTextContent("Java"+i);//创建lan的⼦标签Element ide = newxml.createElement("ide");//设置内容ide.setTextContent("Eclipse"+i);//将name和ide分别加⼊lan这个标签中lan.appendChild(name);lan.appendChild(ide);//将lan将⼊languages标签中languages.appendChild(lan);}//将languages加⼊到xml⽂件中newxml.appendChild(languages);//实例化Transformer⼯⼚TransformerFactory transformerFactory = TransformerFactory.newInstance();//获取到TransformerTransformer transformer = transformerFactory.newTransformer();//设置输出格式transformer.setOutputProperty("encoding","UTF-8");//设置输出流OutputStream os = new FileOutputStream(file);//将⽂件写出transformer.transform(new DOMSource(newxml),new StreamResult(os));Toast.makeText(getApplicationContext(),"⽣成成功",Toast.LENGTH_SHORT).show(); } catch (ParserConfigurationException e) {e.printStackTrace();} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}}});bt_read.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//获取到DocumentBuilder的⼯⼚实例化DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();try {//拿到DocumentBuilderDocumentBuilder builder = builderFactory.newDocumentBuilder();//解析xml⽂件Document xml = builder.parse(file);//获取其根标签Element languages = xml.getDocumentElement();//根据⼦标签进⾏查找,返回的是⼀个list集合NodeList list = languages.getElementsByTagName("lan");textView.setText("");//将textView中的内容置空for (int i=0; i<list.getLength(); i++){//获取到⼦标签lanElement lan = (Element) list.item(i);//获取到他的属性String id = lan.getAttribute("id");//获取到他的⼦标签name的内容String name = lan.getElementsByTagName("name").item(0).getTextContent();//获取到他的⼦标签ide的内容String ide = lan.getElementsByTagName("ide").item(0).getTextContent();//显⽰到textView中textView.append(id+"\n"+name+"\n"+ide+"\n");}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});}}到这⾥利⽤Document来操作XML⽂件就完成了。

国开作业Android网络开发技术-期末复习69参考(含答案)

国开作业Android网络开发技术-期末复习69参考(含答案)

题目:下列方法中,()执行时释放了锁。

选项A:sleep()选项B:clone选项C:wait()选项D:notify()答案:wait()题目:AsyncTask中的()方法在子线程中执行。

选项A:onPostExecute()选项B:onPreExecute()选项C:doInBackground()选项D:onProgressUpdate()答案:onPostExecute()题目:XML数据的解析方式有()。

(多选)选项A:PULL解析选项B:SAX解析选项C:DOM解析选项D:GSON解析答案:SAX解析, PULL解析 , DOM解析题目:Android中保存某个运行状态和用户信息,最好使用()。

选项A:Content Provider存储选项B:SharedPreferences存储选项C:File存储选项D:SQLite存储答案:SharedPreferences存储题目:SharedPreference存储数据,最后提交数据时,推荐使用()。

选项A:push()选项B:put()选项C:commit()选项D:apply()答案:commit()题目:存储数据到文件时,根据文件区域,可分为()。

(多选)选项A:外部存储选项B:内部存储选项C:网络存储选项D:内存存储答案:内部存储题目:使用SQLite读取数据内容时,用到的核心类是()。

选项A:SQLite选项B:ContentValues选项C:Cursor选项D:SQLiteOpenHelper答案:ContentValues题目:自定义Service时,必须实现的方法是()。

选项A:onBind()选项B:onDestroy()选项C:onCreate()。

解析Xml文件的三种方式

解析Xml文件的三种方式

解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。

它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。

使⽤回调函数来实现。

1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。

利用 XMLPullParser 进行XML 数据解析和处理

利用 XMLPullParser 进行XML 数据解析和处理

利用 XMLPullParser 进行XML 数据解析和处理使用XMLPullParser进行XML数据解析和处理XMLPullParser是一种在Android平台上常用的用于解析和处理XML数据的工具。

它具有快速、高效的特点,能够准确地解析XML 文档,并提供了灵活的API来处理解析结果。

本文将介绍如何利用XMLPullParser进行XML数据解析和处理。

一、XML数据解析的概念和原理XML数据解析是指将XML文档中的数据提取出来并进行处理的过程。

XML文档是一种标记语言,用于描述结构化的数据。

XML数据解析的过程可以分为以下几个步骤:1. 创建XMLPullParser对象:首先,需要创建一个XMLPullParser 对象,用于解析XML文档。

2. 设置输入源:在进行XML数据解析之前,需要设置XMLPullParser的输入源。

输入源可以是一个文件、一个输入流或者一个URL。

3. 解析XML文档:通过调用XMLPullParser对象的相应方法,可以逐行解析XML文档,获取XML文档中的节点信息和数据。

4. 处理解析结果:根据XML数据的结构和需要,可以使用条件语句、循环结构等方式对解析结果进行处理,提取所需的数据,并进行后续的操作。

二、利用XMLPullParser进行XML数据解析的步骤下面逐步介绍如何使用XMLPullParser进行XML数据解析和处理的具体步骤。

步骤1:导入相关的类和包在使用XMLPullParser进行XML数据解析之前,需要导入相应的类和包。

具体的导入语句如下:import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import java.io.InputStream;步骤2:创建XMLPullParser对象需要通过XmlPullParserFactory类的newInstance()方法创建XmlPullParserFactory对象,并通过XmlPullParserFactory对象的newPullParser()方法创建XMLPullParser对象,示例代码如下:XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser parser = factory.newPullParser();步骤3:设置输入源设置XMLPullParser对象的输入源,可以是一个输入流、一个文件或者一个URL。

Android开发基础(试卷编号162)

Android开发基础(试卷编号162)

Android开发基础(试卷编号162)说明:答案和解析在试卷最后1.[单选题]下面哪个不是Android SDK中的ViewGroup(视图容器)?A)LinearLayoutB)ListViewC)GridViewD)Button2.[单选题]下列属性中,用于设置LinearLayout方向的是( )。

A)orientationB)gravityC)layout_gravityD)padding3.[单选题]以下哪个控件用来显示文本()A)ImageViewB)TextViewC)EditViewD)Button4.[单选题]显示Spinner控件需要用到的适配器是()A)ArrayAdapterB)SimpleAdapterC)SimpleCursorAdapterD)Adapter5.[单选题]下列哪一个选项不属于AdapterView 类的子选项? Gallery ListViewSpinnerGridViewA)ListViewB)SpinnerC)GridViewD)ScrollView6.[单选题]关于适配器的说法正确的是?A)它主要是用来存储数据B)它主要用来把数据绑定到组件上7.[单选题]下列( )属于未成年人的不良行为。

A)多次偷窃B)旷课、夜不归宿C)吸食、注射毒品D)携带管制刀具,屡教不改8.[单选题]下面关于Android dvm的进程和Linux 的进程, 应用程序的进程说法正确的是()A)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 不一定拥有一个独立的Dalvik 虚拟机实例. 而每一个DVM都是在Linux 中的一个进程, 所以说可以认为是同一个概念.B)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 不一定拥有一个独立的Dalvik 虚拟机实例. 而每一个DVM不一定都是在Linux 中的一个进程, 所以说不是一个概念.C)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 都拥有一个独立的Dalvik 虚拟机实例. 而每一个DVM不一定都是在Linux 中的一个进程, 所以说不是一个概念.D)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 都拥有一个独立的 Dalvik 虚拟机实例. 而每一个DVM都是在Linux 中的一个进程, 所以说可以认为是同一个概念.9.[单选题]把播放音乐的操作放到Service里以下说法正确的是( ).A)可以提高运行效率B)播放音乐的操作必须放入到服务里C)在Service里更安全D)放到服务里目的是提升进程的优先级,不容易被系统回收10.[单选题]内部存储和外部存储需要额外的权限吗?( )A)不需要,不需要B)需要,不需要C)需要,需要D)不需要,需要11.[单选题]请问组件与数据之间通过下面哪个类进行连接?()A)AdapterD)GridView12.[单选题]数据下标越界,则发生( )异常。

Android 课后习题

Android 课后习题

第1章Android 基础入门一、填空题1、Android 是Google 公司基于Linux 、操作系统2、Android 系统采用分层结构,应用程序层、应用程序框架层、核心类库、Linux 内核。

3、ADB 的常见指令中,用于开启ADB 服务的是adb start-server。

4、在Android 程序中,src 目录用于放置程序的java 代码文件5、Android 程序开发完成后,如果要发布到互联网上供别人使用,打包成.apk 文件二、判断题1、Android 实际上就是一个手机。

×2、WCDMA 是中国自己独自定制的3G 标准,中国移动使用的就是这种标准。

×3、android 第一个版本Android 1.1是2008年9月发布的。

√4、gen 目录是自动生成的,主要有一个R.java 文件,该文件可手动修改。

×5、AndroidManifest.xml 文件是整个程序的配置文件。

√三、选择题1、随着智能手机的发展,移动通信技术也在不断升级,目前应用最广泛的是(C )A 、1GB 、2GC 、3GD 、4G2、ADT Bundle中包含了三个重要组成部分,分别是(ABC )A 、EclipseB 、SDKC 、SDK Manager,exeD 、ADB3、应用程序层是一个核心应用程序的集合,主要包括(B )A 、活动管理器B 、短信程序C 、音频驱动D 、Dalivik 虚拟机4、ADB 的常见指令中“列出所有设备”的指令是(C )A 、adb uninstallB 、adb installC 、adb deviceD 、adb emulator -avd5、创建程序时,填写的Application Name表示(A )A 、应用名称B 、项目名称C 、项目的包名D 、类的名字四、简答题1、简要说明Android 体系结构中每个层的功能。

Android 体系结构总共包含四层,分别是:● 应用程序层:设备上安装的软件应用都属于这一层● 应用程序框架层:包含应用API● 核心类库:包含系统库和运行环境,系统库包含了底层C 代码;运行环境包含了Java的核心库和Dalvik 虚拟机● Linux 内核:提供Android 的底层驱动。

PULL解析详解共6页

PULL解析详解共6页

pull解析xml文件,和sax和dom一样都可以脱离android 单独使用,pull和sax的原理一样,不一样的地方是pull读取xml文件后调用方法返回的是数字,读取到xml的声明返回数字0 START_DOCUMENT;读取到xml的结束返回数字1 END_DOCUMENT ;读取到xml的开始标签返回数字2 START_TAG读取到xml的结束标签返回数字3 END_TAG读取到xml的文本返回数字4 TEXTpull是开源的项目源码下载地址/ 被解析的xml文档和android dom 解析xml方式中的xml文档一样,命名为pullTest.xml.1private String pullParseXml(InputStream inputStream) {2 String result = "";3 //解析全部的xml4 boolean isParse = true;5 try {6 // 创建一个xmlPullParser的工厂7 XmlPullParserFactory factory =XmlPullParserFactory.newInstance();8 // 获取一个解析实例9 XmlPullParser parse = factory.newPullParser();10 // 设置输入流的编码格式11 parse.setInput(inputStream, "UTF-8");12 // 当前事件的类型13 int eventType = parse.getEventType();14 while (XmlPullParser.END_DOCUMENT != eventType) {15 // 当前节点的名称16 String nodeName = parse.getName();17 switch (eventType) {18 case XmlPullParser.START_TAG:19 if ("group".equals(nodeName)) {20 // 解析<group>节点中的属性值,getAttributeCount()获取属性的个数21 for (int i = 0; i <parse.getAttributeCount(); i++) {22 // 属性名称23 String groupName =parse.getAttributeName(i);24 // 属性名称对应的值25 String nameValue =parse.getAttributeValue(i);26result = result + groupName + "= " + nameValue;27 result += "\n";28 } else if ("person".equals(nodeName)) {29 String personName =parse.getAttributeValue(0);30 String age =parse.getAttributeValue(1);31result = result + "personName = " + personName32 + "age =" + age + "\n";33 } else if ("chinese".equals(nodeName)) {34 //节点对应的文本35 String chinese = parse.nextText();36 Pattern p =Pattern pile("\\s*|\t|\r|\n");37 Matcher m = p.matcher(chinese);38chinese = m.replaceAll("");39result = result + "chinese = " + chinese;40 } else if ("english".equals(nodeName)) {41 String english = parse.nextText();42 Pattern p =Pattern pile("\\s*|\t|\r|\n");43 Matcher m = p.matcher(english); 44english = m.replaceAll("");45result = result + "english = " + english + "\n";46 break;47 case XmlPullParser.END_TAG:48 //在解析到一个group节点完成时,退出解析xml文件49// if("group".equals(nodeName)){50// eventType =XmlPullParser.END_DOCUMENT;51// isParse = false;52 break;53 default:54 break;55 //整个xml文件全部解析56 if(isParse){57eventType = parse.next();58 } catch (XmlPullParserException e) {59 // TODO Auto-generated catch block60 e.printStackTrace();61 } catch (IOException e) {62 // TODO Auto-generated catch block63 e.printStackTrace();64 return result;pull和sax不同最主要的体现在pull可以由客户随时终止解析xml.sax 解析,只能从文档头一直读到尾,中间不能停止也不能对文件进行修改。

《Android移动应用基础教程》我国铁道出版社课后习题[含答案解析]

《Android移动应用基础教程》我国铁道出版社课后习题[含答案解析]

Android移动应用基础教程习题答案姓名:班级:联系方式:第1章 Android基础入门一、填空题1、Android是Google公司基于Linux平台开发的手机及平板电脑的操作系统2、Android系统采用分层结构,由高到低依次为应用程序层、应用程序框架层、核心类库、Linux内核。

3、ADB的常见指令中,用于开启ADB服务的是adb start-server。

4、在Android程序中,src目录用于放置程序的java代码文件。

5、Android程序开发完成后,如果要发布到互联网上供别人使用,需要将程序打包成.apk文件。

二、判断题1、Android实际上就是一个手机。

×2、WCDMA是中国自己独自定制的3G标准,中国移动使用的就是这种标准。

×3、android第一个版本Android 1.1是2008年9月发布的。

√4、gen目录是自动生成的,主要有一个R.java文件,该文件可手动修改。

×5、AndroidManifest.xml文件是整个程序的配置文件。

√三、选择题1、随着智能手机的发展,移动通信技术也在不断升级,目前应用最广泛的是(C)A、1GB、2GC、3GD、4G2、ADT Bundle中包含了三个重要组成部分,分别是(ABC)A、EclipseB、SDKC、SDK Manager,exeD、ADB3、应用程序层是一个核心应用程序的集合,主要包括(B)A、活动管理器B、短信程序C、音频驱动D、Dalivik虚拟机4、ADB的常见指令中“列出所有设备”的指令是(C)A、adb uninstallB、adb installC、adb deviceD、adb emulator-avd5、创建程序时,填写的Application Name表示(A)A、应用名称B、项目名称C、项目的包名D、类的名字四、简答题1、简要说明Android体系结构中每个层的功能。

XML解析的三种方法

XML解析的三种方法

三种解析XML文件的方法在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。

下面是本例子要解析的XML文件:文件名称:china.xml例子定义了一个javabean用于存放上面解析出来的xml内容,这个javabean为Person,代码:使用SAX读取XML文件SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。

SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。

所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

下面是一些ContentHandler接口常用的方法:startDocument()当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。

endDocument()和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。

startElement(String namespaceURI, String localName, String qName, Attributes atts) 当读到一个开始标签的时候,会触发这个方法。

namespaceURI就是命名空间,localName 是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。

通过atts可以得到所有的属性名和相应的值。

要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。

【奥鹏】[南开大学]19秋学期(1709、1803、1809、1903、1909)《手机应用软件设计与实现》在线作业-2

【奥鹏】[南开大学]19秋学期(1709、1803、1809、1903、1909)《手机应用软件设计与实现》在线作业-2
C、C. 他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名,可以为空,而值都是String类型
D、D. 他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值也是String类型
正确答案:B,C,D
第35题,以下属于Activity声明周期的方法是
B、B. 不需要在 manifest.xml 清单文件 manifest 节点下配置instrumentation
C、C. 需要在 manifest.xml 清单文件 application 节点下配置 uses-permission
D、D. 需要让测试类继承 AndroidTestCase 类
C、C. 在Activity中,可以使用setContentView( )方法,确定加载哪一个布局文件
D、D. 可以使用View类的findViewById( )方法,获得当前View对象中的某一个视图元素
正确答案:B
第27题,在k中下列哪个方法是负责在完成任务后再执行的
A、A. 主要放置多媒体等数据文件
B、B. 放置字符串,颜色,数组等常量数据
C、C. 放置一些与UI相应的布局文件,都是xml文件
D、D. 旋转应用程序所使用的图片资源
正确答案:A
第15题,创建子菜单的方法是?
A、A. Add
B、B. addSubMenu
C、C. createSubMenu
C、C、代表该Activity将在桌面上建立图标并启动
D、D、代表该Activity的优先级高于其他的Activity
正确答案:B
第3题,WebView中可以用来处理js中警示,确认等对话框的是

Android开发基础(习题卷6)

Android开发基础(习题卷6)

Android开发基础(习题卷6)第1部分:单项选择题,共70题,每题只有一个正确答案,多选或少选均不得分。

1.[单选题]对于XML布局文件中的视图控件,layout_width属性的属性值不可以是()A)match_parentB)fill_parentC)wrap_contentD)match_content答案:D解析:2.[单选题]在BaseAdapter的方法中,根据位置得到条目的ID的方法是( )A)getView()B)getItem()C)getItemId()D)getCount()答案:C解析:3.[单选题]为了让一个ImageView控件显示一张图片,可以设置的属性是( )A)android:srcB)android:backgroundC)android: imgD)android:value答案:A解析:4.[单选题]在Java 中, ( )类提供定位本地文件系统,对文件或目录及其属性进行基本操作。

A)FileInputStreamB)FileReaderC)FileWriterD)File答案:D解析:5.[单选题]GestureDetector 中onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 方法中的参数e1 代表( ) 。

A)抬起来的那个事件B)按下去和抬起来的事件C)按下去的那个事件D)以上都不对答案:C解析:答案说明: e1: 按下去的那个事件, e2: 抬起来的那个事件velocityX 是X轴的速度, 单位是像素, velocityY 是Y轴的速度, 单位是像素;6.[单选题]下面关于JSON说法错误的是:( )A)json 是一种数据交互格式。

B)json 的数据格式有两种为{ }和[ ]C)json 数据用{ }表示java 中的对象, [ ]表示Java中的List 对象D){“1”:”123”, ”2”:”234”, ”3”:”345”} 不是json 数据答案:D解析:7.[单选题]在播放视频或音频时,如果有电话打入,这时候视频或音频会自动挂起吗?( )A)不会B)会C)有的手机会,有的手机不会D)以上说法都错误答案:A解析:8.[单选题]在Android应用开发中,使用()作为项目唯一标识。

Android学习笔记之AndroidManifest.xml文件解析(详解)

Android学习笔记之AndroidManifest.xml文件解析(详解)

Android学习笔记之AndroidManifest.xml⽂件解析(详解)⼀、关于AndroidManifest.xmlAndroidManifest.xml 是每个android程序中必须的⽂件。

它位于整个项⽬的根⽬录,描述了package中暴露的组件(activities, services, 等等),他们各⾃的实现类,各种能被处理的数据和启动位置。

除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)⼆、AndroidManifest.xml结构<?xmlversion="1.0"encoding="utf-8"?><manifest><application><activity><intent-filter><action/><category/></intent-filter></activity><activity-alias><intent-filter></intent-filter><meta-data/></activity-alias><service><intent-filter></intent-filter><meta-data/></service><receiver><intent-filter></intent-filter><meta-data/></receiver><provider><grant-uri-permission/><meta-data/></provider><uses-library/></application><uses-permission/><permission/><permission-tree/><permission-group/><instrumentation/><uses-sdk/><uses-configuration/><uses-feature/><supports-screens/></manifest>三、各个节点的详细介绍上⾯就是整个am(androidManifest).xml的结构,下⾯以外向内开始阐述~~1、第⼀层(<Manifest>):(属性)A、xmlns:androidB、package指定本应⽤内java主程序包的包名,它也是⼀个应⽤进程的默认名称C、sharedUserIdD、sharedUserLabel⼀个共享的⽤户名,它只有在设置了sharedUserId属性的前提下才会有意义E、versionCode是给设备程序识别版本(升级)⽤的必须是⼀个interger值代表app更新过多少次,⽐如第⼀版⼀般为1,之后若要更新版本就设置为2,3等等。

Android测试复习题 2

Android测试复习题 2

选择题:1、下列语句关于内存回收的说明是正确的是()B、内存回收程序负责释放无用内存2、Math.round(11.5) 和Math.round(-11.5)的结果分别为()C、12 ,-113、对一些资源以及状态的操作保存,最好是在生命周期的哪个函数中进行(D、onStart()4、android中下列属于Intent的作用的是()C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带5、下列属于SAX解析xml文件的优点的是()B、不用事先调入整个文档,占用资源少6、下面的对自定style的方式正确的是()A、<resources><style name="myStyle"><itemname="android:layout_width">fill_parent</item></style></resources>7、在android中使用SQLiteOpenHelper这个辅助类时,可以生成一个可写的数据库,并可以对数据库版本进行管理的方法可以是()A、getWriteableDatabase()8、我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是()C、onDestroy()8、下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是()D、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.9、Android项目工程下面的assets目录的作用是什么()B、主要放置多媒体等数据文件10、关于res/raw目录说法正确的是()A、这里的文件是原封不动的存储到设备上不会转换为二进制的格式11、以下哪个不是android的四大组价()D、Intent12、以下哪个布局最不赞成被使用()C、AbsoluteLayout13、哪个组件可以提供一个既有文本又有图片的按钮()B、Button14、当一个Activity被新的Activity取代但还部分可见时,它处于()A、暂停状态15、在android项目中,图片放在哪个目录中()D、drawable16、在AndroidManifest.xml文件中,activity的label属性用于()B、描述Activity的图标17、以下哪个用于产生一个无界面、运行于后台的程序()C、Service18、Android中以哪种方式组织管理Activity()A、以栈的方式19、在表格布局中,android:collapseColumns="1,2"的含义是()C、在屏幕中,不管是否能都显示完,折叠1、2列20、绝对布局中,android:layout_x 的含义有()B、以手机左上为原点,组件显示到屏幕中的横向坐标值。

Android网络开发技术形考答案无删改-全篇

Android网络开发技术形考答案无删改-全篇

Android网络开发技术形考任务1【简答题】完成以下JSON的解析,完成主体代码即可,解析方法及库不限。

其实JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,里面有等符号,其中1 []中括号代表的是一个数组;2 {}大括号代表的是一个对象3 双引号“”表示的是属性值4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。

答:public class JSONObjectActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(yout.activity_jsonobject);new Thread(new Runnable() {@Overridepublic void run() {// 模拟进行网络请求String jsonResult = FileUtils.readXML();parseJson(jsonResult);}}).start();}private void parseJson(String jsonData) {Person person = new Person();try {JSONObject jsonObject = new JSONObject(jsonData);// 解析persons数组JSONArray phones =jsonObject.getJSONArray("phones");person.phones = new ArrayList<>();for (int i = 0; i < phones.length(); i++) { person.phones.add((String) phones.get(i));}// 解析普通属性 = jsonObject.getString("name");person.age = jsonObject.getInt("age");// 解析addressJSONObject addressJson =jsonObject.getJSONObject("address");Address address = new Address();address.country = addressJson.getString("country");address.province =addressJson.getString("province");person.address = address;System.out.println(person.toString());} catch (JSONException e) {e.printStackTrace();}}class Person {List<String>phones;String name;int age;Address address;@Overridepublic Stsring toString() { return "Person{"+"phones ="+ phones +", name=''' + name + '\" + ", age="+ age +", address="+ address +'}';}}class Address {String country;String province;@Overridepublic String toString() {return "Address{"+"country=''' + country + '\" +", province=''' + province + '\" + '}';}}Android网络开发技术形考任务2答:<?xml version="1.0"encoding="utf-8"?><manifestxmlns:Android="/apk/res/Andro id"package="com.gk.my12306"><uses-permissionAndroid:name="Android.permission.GET_ACCOUNTS"/><uses-permissionAndroid:name="Android.permission.READ_PROFILE"/><uses-permissionAndroid:name="Android.permission.READ_CONTACTS"/><uses-permissionAndroid:name="Android.permission.CHANGE_CONFIGURATION"/ ><uses-permissionAndroid:name="Android.permission.WRITE_SETTINGS"/><uses-permissionAndroid:name="Android.permission.ACCESS_NETWORK_STATE"/ ><applicationAndroid:allowBackup="true"Android:icon="@mipmap/ic_launcher"Android:label="@string/app_name"Android:roundIcon="@mipmap/ic_launcher_round"Android:supportsRtl="true"Android:theme="@style/AppTheme"><activity Android:name=".MainActivity"><intent-filter><action Android:name="Android.intent.action.MAIN"/><categoryAndroid:name="UNCHER"/> </intent-filter></activity><activityAndroid:name=".LoginActivity"Android:label="@string/title_activity_login" Android:windowSoftInputMode="adjustPan"/><receiver Android:name=".BootBroadcastReceiver"><intent-filter><actionAndroid:name="Android.intent.action.BOOT_COMPLETED"/> </intent-filter></receiver></application></manifest>}Android网络开发技术形考任务31、Android中保存某个运行状态和用户信息,最好使用(SharedPreferences存储)。

安卓考试题目及答案

安卓考试题目及答案

一、选择题1.(2分) Android解析xml的方法中,将整个文件加载到内存中进行解析的是?()A、SAXB、PULLC、DOM D 、JSON2.(2分)以下属于调用摄像头硬件的权限的是:()A.<uses-permission android:name="android.permission.CAMERA"/>B.<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>C.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>D.<uses-permission android:name="android.permission.INTERNET"/>3.(2分) 使用Android系统进行拍照用到的类有:()A. SurfaceViewB. SurfaceHolderC.CallbackD. Camera4.(2分)在AsyncTask中下列哪个方法是负责执行那些很耗时的后台计算工作的()A,run B,execute C,doInBackground D,onPostExecute5.(2分)如果希望自定义TabHost标题部分的显示内容需要使用下列哪个方法()final TabHost tabHost = getTabHost();A,tabHost.addTab(tabHost.newTabSpec("tab1")B,setIndicatorC,setContent();D,setView6.(2分)使用HttpURLConnection的Get方式请求数据时,下列哪个属性是必须设置的()A,connection.setDoOutput(true)B,connection.connect()C,connection.setRequestMethod("POST")D,connection.setDoInput(true)7.(2分)假设assets目录下有文件结构html/hello.html,用loadUrl()方法将该网页加载至webView时,需传入的参数是(B)A, file:///asset/html/hello.htmlB,file:///android_asset/html/hello.htmlC,file:///androidasset/hello.htmlD,file:///assets/html/hello.html8.(2分) 关于ImageSwitcher 说法错误的是:()A.ImageSwitcher里可以通过Alpha设定转换时候的透明位B.在使用一个ImageSwitcher之前,不一定要调用setFactory方法C.setInAnimation是设置资源被读入到这个ImageSwitcher的时候动画效果D.setOutAnimation是资源文件从这个ImageSwitcher里消失的时候要实现的动画效果9.(2分) android中文件操作模式中表示只能被本应用使用,写入文件会覆盖的是____A, MODE_APPEND B,MODE_WORLD_READABLEC,MODE_WORLD_WRITEABLE D, MODE_PRIVATE10.(2分)对于AlertDialog的描述不正确的是_____A,使用new关键字创建AlertDialog的实例B,对话框的显示需要调用show方法C,setPositiveButton方法是用来加确定按钮的D,setNegativeButton方法是用来加取消按钮的11.(2分)Android 项目工程下面的assets 目录的作用是什么A、放置应用到的图片资源。

解析XML格式数据实例

解析XML格式数据实例

解析XML格式数据实例前言:网络数据传输时,最常用的格式有两种:XML和JSON,下面我们就研究如何使用Pull解析和Sex解析来实现对XML格式文件数据的解析。

实例流程:1.创建服务器:Apache服务器(用于模拟解析网络中的数据)2.在Apache安装目录下的htdocs目录下创建xml格式的文件(用于解析)3.使用Pull方法解析XML数据4.使用SAX方法解析XML数据实例完整步骤:1.创建服务器(可以借鉴这篇博客创建自己的服务器,我就是看这篇的博客)2.在Apache安装目录下的ht docs目录下创建xml格式的文件(用于解析),我创建了get_dat a.xml文件,内容为:<apps> <app> <id>1</id> <name>Google Maps</name> <virsion>1.0</virsion> </app> <app> <id>2</id> <name>Chrome</name> <version>2.1</version> </app> <app> <id>3</id> <name>Google Play</name> <version>2.3</version> </app> </apps>1234567891011121314151617好了,这就是我们需要的准备工作,下面我们来实现使用Pull解析xml格式的数据。

3.使用Pull方法解析XML数据,代码如下:首先是布局文件,添加一个button控件就可以了:<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='/apk/res/android'xmlns:tools='/tools'android:layout_width='match_parent'android:layout_height='match_parent'android:orientation='vertical'tools:context='worktest.MainActivity'><Buttonandroid:id='@ id/send_request_btn'android:layout_width='match_parent'android:layout_height='wrap_content'android:text='send request' /></LinearLayout>1231011121314151617接着我们来修改java代码部分:public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = 'MainActivity'; private Button requestBtn; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(yout.activity_main); bindID(); } private void bindID() { requestBtn = findViewById(R.id.send_request_btn); requestBtn.setOnClickListener(this); } @Override public voidonClick(View v) { switch (v.getId()) { case R.id.send_request_btn: requestWithHttpURLConnection(); break; default: break; } } private void requestWithHttpURLConnection() { new Thread(new Runnable() { @Override public void run() { //这里我使用了OKHttp插件实现访问网络数据,有什么不懂可以看我的前一篇博客 OkHttpClient client = new OkHttpClient(); Request request= new Request.Builder() //这里是将要访问的网络,其中10.0.2.2对Android模拟器来说是计算机本机的IP地址.url('http://10.0.2.2/get_data.xml') .build(); try { final Response response = client.newCall(request).execute(); String responseData = response.body().string(); //调用自定义的parseXMLWithPull()方法实现对XML数据的解析parseXMLWithPull(responseData); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void parseXMLWithPull(String xmlData) { try { //首先获得XmlPullParserFactory对象 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //获得XmlPullParser对象 XmlPullParser xmlPullParser = factory.newPullParser(); //调用setPut()方法将服务器返回的数据放入xmlPullParser中 xmlPullParser.setInput(new StringReader(xmlData)); //获得当前解析事件int eventType = xmlPullParser.getEventType(); String id = null; String name = null; String version = null; while (eventType != XmlPullParser.END_DOCUMENT) { //获得当前解析事件的当前节点的名字,一个解析事件会有多个节点 String nodeName = xmlPullParser.getName(); switch (eventType) { //我的理解是当前解析事件开始事件 case XmlPullParser.START_TAG: if('id'.equals(nodeName)) { //获得当前节点的名字 id = xmlPullParser.nextText(); } else if ('name'.equals(nodeName)) { name = xmlPullParser.nextText(); } else if ('version'.equals(nodeName)) { version = xmlPullParser.nextText(); } break; //我的理解是当前解析事件结束事件 case XmlPullParser.END_TAG: if ('app'.equals(nodeName)) { //当前解析事件结束,打印出解析的结果Log.e(TAG, 'parseXMLWithPull: ' 'id=' id); Log.e(TAG, 'parseXMLWithPull: ' 'name=' name); Log.e(TAG,'parseXMLWithPull: ' 'version' version); } break; default: break; } //获得下一个解析事件 eventType =xmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } } }12345678910111213141516171819202122232425262735 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 8182 83 84 85 86949596979899100over效果展现:4.使用SAX方法解析XML数据1.新建类继承DefaultHandler重写五种方法:public class ContentHandler extends DefaultHandler {private String nodeName;private StringBuilder id;private StringBuilder name;private StringBuilder version;private static final String TAG = 'ContentHandler';//开始xml解析的时候被调用@Overridepublic void startDocument() throws SAXException {super.startDocument();id = new StringBuilder();name = new StringBuilder();version = new StringBuilder();}//开始解析某个节点时被调用@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes);//获取当前节点名nodeName = localName;}//获取当前节点的内容@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);if ('id'.equals(nodeName)){id.append(ch,start,length);}else if('name'.equals(nodeName)){name.append(ch,start,length);}else if('version'.equals(nodeName)){version.append(ch,start,length);}//Log.e(TAG, 'characters: ' 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh' );}//完成解析某个节点时被调用@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);if('app'.equals(localName)){//因为characters()方法可能将一些换行符读入,所以要调用trim()方法Log.e(TAG, 'endElement: ' 'id=' id.toString().trim());Log.e(TAG, 'endElement: ' 'name=' name.toString().trim() );Log.e(TAG, 'endElement: ' 'version=' version.toString().trim() );//不要忘了将stringbuilder清空id.setLength(0);name.setLength(0);version.setLength(0);}}@Overridepublic void endDocument() throws SAXException {super.endDocument();}}4567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556在java代码出调用:e.printStackTrace(); } } }).start(); } private void parseXMLWithSEX(String xmlData) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader xmlReader = factory.newSAXParser().getXMLReader(); ContentHandler contentHandler = new ContentHandler(); //使用setContentHandler()方法将ContentHandler对象放入xmlReader中xmlReader.setContentHandler(contentHandler); //解析xml数据 xmlReader.parse(new InputSource(newStringReader(xmlData))); } catch (Exception e) { e.printStackTrace(); } } }1234567891011121314151617181920212223242526272829303132333435363738394041424344over,运行效果和之前的一样。

PULL解析技术

PULL解析技术
InputStream inStream =XmlPersonServiceTest.class.getClassLoader().getResourceAsStream("tyler.xml") ;
List<Person>persons=DOinStream);
break;
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())){
person=new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
//使用SAX解析xml内容
public void testSAXReadXml()throws Exception{
InputStream inStream =XmlPersonServiceTest.class.getClassLoader().getResourceAsStream("tyler.xml") ;
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.attribute(null, "age", String.valueOf(person.getAge()));
serializer.endTag(null, "age");
List<Person>persons=SAXPersonService.readXml(inStream);

Dom4J、JDOM、DOM、SAX和Pull技术解析XML文件

Dom4J、JDOM、DOM、SAX和Pull技术解析XML文件

解析XML文件的五种技术1.1SAX技术SAX处理的优点非常类似于流媒体的优点。

分析能够立即开始,而不是等待所有的数据被处理。

而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。

这对于大型文档来说是个巨大的优点。

事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。

一般来说,SAX还比它的替代者DOM快许多。

选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM 还是SAX解析模型是一个非常重要的设计决策。

DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。

用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。

可以很容易的添加和修改树中的元素。

然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。

由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。

SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。

但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

1.1.1 SAX语法简介SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。

SAX 解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我们使用SAX方式解析xml文档,SAX方式是基于事件驱动的。

当然android的事件机制是基于回调函数的。

在这一节中,我们用另外一种方式解析xml文档,这种方式也是基于事件驱动的,与SAX方式一样,它就是PULL方式。

只不过PULL方式读xml回调方法返回的是数字。

读取到xml的声明返回START_DOCUMENT;
读取到xml的结束返回 END_DOCUMENT ;
读取到xml的开始标签返回START_TAG
读取到xml的结束标签返回END_TAG
读取到xml的文本返回TEXT
xml数据结果还是采用我们先前使用的river.xml文件。

采用PULL方式与SAX大同小异,重点在于我们需要知道导航到什么标签时候做什么就行了,依据上一节SAX处理方式的思路,我们也可以在这一节中一样处理,基本方法是:
基本处理方式是:当PULL解析器导航到文档开始标签时就开始实例化list集合用来存贮数据对象。

导航到元素开始标签时回判断元素标签类型,如果是river标签,则需要实例化River对象了,如果是其他类型,则取得该标签内容并赋予River对象。

当然它也会导航到文本标签,不过在这里,我们可以不用。

根据以上的解释,我们可以得出以下处理xml文档逻辑:
1:当导航到XmlPullParser.START_DOCUMENT,可以不做处理,当然你可以实例化集合对象等等。

2:当导航到XmlPullParser.START_TAG,则判断是否是river标签,如果是,则实例化river对象,并调用getAttributeValue方法获取标签中属性值。

3:当导航到其他标签,比如Introduction时候,则判断river对象是否为空,如不为空,则取出Introduction中的内容,nextText方法来获取文本节点内容
4:当然啦,它一定会导航到XmlPullParser.END_TAG的,有开始就要有结束嘛。

在这里我们就需要判读是否是river结束标签,如果是,则把river对象存进list集合中了,并设置river对象为null.
由以上的处理逻辑,我们可以得出以下代码:
View Code
public List<River> parse(String xmlPath){
List<River> rivers=new ArrayList<River>();
River river=null;
InputStream inputStream=null;
//获得XmlPullParser解析器
XmlPullParser xmlParser = Xml.newPullParser();
try {
//得到文件流,并设置编码方式
inputStream=this.context.getResources().getAsse ts().open(xmlPath);
xmlParser.setInput(inputStream, "utf-8");
//获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等等事件。

int evtType=xmlParser.getEventType();
//一直循环,直到文档结束
while(evtType!=XmlPullParser.END_DOCUMENT){
switch(evtType){
case XmlPullParser.START_TAG:
String tag = xmlParser.getName();
//如果是river标签开始,则说明需要实例化对象了
if (tag.equalsIgnoreCase(RIVER)) {
river = new River();
//取出river标签中的一些属性值
river.setName(xmlParser.getAttributeValue (null, NAME));
river.setLength(Integer.parseInt(xmlParser. getAttributeValue(null, LENGTH)));
}else if(river!=null){
//如果遇到introduction标签,则读取它内容
if(tag.equalsIgnoreCase(INTRODUCTION)){
river.setIntroduction(xmlParser.nextText ());
}else if(tag.equalsIgnoreCase(IMAGEURL)){ river.setImageurl(xmlParser.nextText ());
}
}
break;
case XmlPullParser.END_TAG:
//如果遇到river标签结束,则把river对象添加进集合中
if (xmlParser.getName().equalsIgnoreCase(RIVE R) && river != null) {
rivers.add(river);
river = null;
}
break;
default:break;
}
//如果xml没有结束,则导航到下一个river节点
evtType=xmlParser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return rivers;
}
运行结果与其他2个一样:。

相关文档
最新文档