当前位置:首页 » 安卓系统 » androidparse

androidparse

发布时间: 2022-06-21 06:02:31

⑴ android里面怎么解析xml

Android解析xml文件总共有三种方法,分别是:

  1. SAX解析XML文件:SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。如下代码:


    java">publicstaticList<Person>readXML(InputStreaminStream){
    try{
    //创建解析器
    SAXParserFactoryspf=SAXParserFactory.newInstance();
    SAXParsersaxParser=spf.newSAXParser();

    //设置解析器的相关特性,true表示开启命名空间特性
    saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
    XMLContentHandlerhandler=newXMLContentHandler();
    saxParser.parse(inStream,handler);
    inStream.close();

    returnhandler.getPersons();
    }catch(Exceptione){
    e.printStackTrace();
    }

    returnnull;
    }


    //SAX类:DefaultHandler,它实现了ContentHandler接口。在实现的时候,只需要继承该类,重载相应的方法即可。
    {

    privateList<Person>persons=null;
    privatePersoncurrentPerson;
    privateStringtagName=null;//当前解析的元素标签

    publicList<Person>getPersons(){
    returnpersons;
    }

    //接收文档开始的通知。当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
    @Override
    publicvoidstartDocument()throwsSAXException{
    persons=newArrayList<Person>();
    }

    //接收元素开始的通知。当读到一个开始标签的时候,会触发这个方法。其中namespaceURI表示元素的命名空间;
    //localName表示元素的本地名称(不带前缀);qName表示元素的限定名(带前缀);atts表示元素的属性集合
    @Override
    publicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts)throwsSAXException{

    if(localName.equals("person")){
    currentPerson=newPerson();
    currentPerson.setId(Integer.parseInt(atts.getValue("id")));
    }

    this.tagName=localName;
    }

    //接收字符数据的通知。该方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,
    //后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用newString(ch,start,length)就可以获取内容。
    @Override
    publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{

    if(tagName!=null){
    Stringdata=newString(ch,start,length);
    if(tagName.equals("name")){
    this.currentPerson.setName(data);
    }elseif(tagName.equals("age")){
    this.currentPerson.setAge(Short.parseShort(data));
    }
    }
    }

    //接收文档的结尾的通知。在遇到结束标签的时候,调用这个方法。其中,uri表示元素的命名空间;
    //localName表示元素的本地名称(不带前缀);name表示元素的限定名(带前缀)
    @Override
    publicvoidendElement(Stringuri,StringlocalName,Stringname)throwsSAXException{

    if(localName.equals("person")){
    persons.add(currentPerson);
    currentPerson=null;
    }

    this.tagName=null;
    }
    }
  2. DOM解析XML文件: DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

  3. Pull解析器解析XML文件: Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值

⑵ 如何在Android中调用浏览器打开网页

public class MainActivity extends Activity {
private static final String TAG = "ActivityDemo";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(http://www.jb51.net);
intent.setData(content_url);
startActivity(intent);

}

@Override
protected void onResume() {
super.onResume();
//具体方法看这里的代码
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse("http://..com");
intent.setData(content_url);
startActivity(intent);
Log.e(TAG, "start onResume~~~");
}

@Override
protected void onStop() {
super.onStop();
this.finish();
Log.e(TAG, "start onStop~~~");
}
}

⑶ android中Uri.parse()用法

通用资源标志符(Universal Resource Identifier, 简称"URI")。
Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。Android平台而言,URI主要分三个部分:

  1. scheme

  2. authority

  3. path


其中authority又分为host和port。格式如下:

scheme://host:port/path


实际的例子:



我们很经常需要解析Uri,并从Uri中获取数据。
Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。
掌握它们的使用,会便于我们的Android开发工作。

⑷ android上一些方法的区别和用法的注意事项

拨号键可以把屏幕按黑。
2.向上声音+返回解锁(有图形或者密码锁的不行)
3.开机按电源+向上声音可以进去刷机模式
4.按声音向下+搜索或者菜单可以截图,不需要权限
5. 下载个java和免流量uc,上网不需要流量(以前移动和联通都可以,现在移动封了,只有联通可以)
6.使用Android电源管理widget 从Android 2.1系统开始内置了一个非常强大的带能源管理widget,通过这个widget你可以快速开启或者关闭Wi-Fi,蓝牙,GPS,同步这些手机耗电大户,还可以方便的设定手机屏幕亮度,长按手机屏幕,就可以在widgets目录选择启用。
7.Android手机拨号屏幕 如果你对手机拨号屏幕功能性有特殊要求,Android绝对会满足你,点击联系人列表里任意一个用户,按手机menu >选项,里面有关于单个联系人的详细设置。
8.为每个联系人定制铃声 可以为女朋友或者家人设置单独的铃声,这样听到铃声就知道谁来电话了。设置方法点击联系人列表里任意一个用户,然后就可以设置铃声
9.不要把手机闹钟(alarm clock)加入进程查杀列表里 这是一个经典的错误,很多用户都喜欢用进程管理程序自动杀掉一些程序以节省电量或者腾出手机内存,不过如果不小心alarm clock进程也杀掉了,后果就是第二天早晨10:30才醒过来惊慌失措的奔向公司。
10用文件夹组织内容 虽然乔布斯花了很久才决定放开iOS用户通过文件夹组织内容的权限,事实上Android从面世开始就支持这个功能,Android文件夹不但支持放入程序图标,还可以存放通讯录,甚至facebook联系人等信息,长按手机屏幕就可以在桌面建立文件夹。
11.挂载你的SD卡 Android系统基于Linux内核,所以使用外部磁盘之前必须要mount挂载后才可以正常使用。使用USB线连接手机和电脑时,手机会提示挂载SD卡,必须点击完成挂载后才可以在SD卡里拷贝或者删除数据。
12.设置键盘快捷方式 很多用户迷恋物理全键盘的另外一个重要原因就是Android支持大量的键盘快捷键,通过快捷键可以快速调用相关程序,可以在系统设置>应用程序>快速启动里设置
13.下载网页图片 浏览网页时想保存图片,只要长按图片就可以单独保存,保存的图片可以在相册程序中查看。
4.跳过Android滑动解锁屏幕 Android手机用户一般都采用滑动解锁屏幕的方式来唤醒手机,不过你可能不知道按两下手机的Menu键也有同样的效果,前提是你的手机制造商没有移除这个功能,很多装载HTCSense手机可能无法使用这个特性。
15.更多Android表情 上面一条技巧也适用于Android表情符号输入,长按一种Android微笑表情会调出其他系统的微笑表情符号。
16.让手机说一口纯真英国腔 你可能发现在使用Google Maps导航的时候英语发音非常奇怪,可以在Menu >设置 >文字转语音 里勾选“始终使用我的设置”选项,接下来你会发现导航发音变成了一口纯真英国腔,听起来舒服多了。
17.删除那些臃肿的程序 使用不支持APP2SD功能的Android手机的程序狂人们可能经常面临手机内存不足的窘境,需要删除部分应用程序解放空间。在设置 >应用程序 >管理应用程序 界面可以按Menu键按照程序大小排序,优先删除那些占用大量空间的程序。
18.激活扬声器 有时候会碰到接听电话时环境太吵杂听不清楚的情况,在通话界面按Menu键然后选择“扬声器”选项,保证不但你能听清,周围人也能听清电话那头在说什么。
19.电源键 简介:实体键中使用最频繁的一个,因为肩负着锁屏/点亮屏幕的重担(亚历山大)。也是损耗最多的按键。 主要功能:开机、关机重启*、点亮屏幕和锁屏。加星号的额外说明,在MIUI下,通知栏开关简洁风格,长按电源键会弹出"手机选项"的菜单;而在通知栏开关为单页风格时,长按会拉下通知栏。另外,在recovery下(开机时按住音量加和电源键可以进入),电源键有确认的功能。
20.音量键(+-) 主要功能:增加或减少音量。在主界面是更改铃声音量、在通话界面则可以更改通话音量,在音乐里可以更改媒体音量…在主界面,按住音量-,可以切换到静音模式。同时,也可以作为点亮屏幕的按键使用,方法是设置-系统-按键-音量键唤醒。在recovery中,有上下移动的功能

⑸ android 两个字符串日期比较

1. 这两个字符串都是源自Date类型或者long类型,你如果能抓到原型用long值比较就方便多啦: (nDate1 - nDate2 > 3*24*60*60000) 即可。
2.如果不能得到原型,只能传入这个String类型,建议还是逐个还原为int值再放到long类型里,再用上面的方法1进行比较,这样不用考虑太多String比较的复杂案例。

⑹ android开发怎么调用浏览器打开一个链接

在安卓代码中调用浏览器来打开相应的网页,一般有以下几种方式

  1. 调用默认浏览器。

  2. 其他浏览器。

  3. 自定义一个简单的WebView浏览器。

【原理】

主要是通过代码进行调用已有或者未有的浏览器进行打开相应的网页进行浏览。

【详细实现步奏】

一.调用默认浏览器

优缺点:部分手机可能连默认的浏览器都没有。


Intentintent=newIntent();
//Intentintent=newIntent(Intent.ACTION_VIEW,uri);
intent.setAction("android.intent.action.VIEW");
Uricontent_url=Uri.parse("此处填链接");
intent.setData(content_url);
startActivity(intent);

二.其他浏览器,制定打开

缺点:必须知道打开的浏览器的包名,大部分用户可能没有安装这些浏览器

Intentintent=newIntent();
intent.setAction("android.intent.action.VIEW");
Uricontent_url=Uri.parse("此处填链接");
intent.setData(content_url);
intent.setClassName("浏览器包名","浏览器首页");
startActivity(intent);


三.自定义一个简单的WebView浏览器

优缺点:推荐使用,不必担心手机上是否有浏览器。

mWebView=(WebView)findViewById(R.id.baseweb_webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(newWebViewClient());
WebViewmyWebView=(WebView)findViewById(R.id.webview);
myWebView.loadUrl("xxx.com");

【最后】

每种方法根据个人需要进行选用,没其他特别因素推荐使用第三种方案。

⑺ android 怎么把日期字符串解析出 月份和日期

//需要解析的日期字符串
StringdateStr="2015-09-2712:15:31";
//解析格式,yyyy表示年,MM(大写M)表示月,dd表示天,HH表示小时24小时制,小写的话是12小时制
//mm,小写,表示分钟,ss表示秒
SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
try{
//用parse方法,可能会异常,所以要try-catch
Datedate=format.parse(dateStr);
//获取日期实例
Calendarcalendar=Calendar.getInstance();
//将日历设置为指定的时间
calendar.setTime(date);
//获取年
intyear=calendar.get(Calendar.YEAR);
//这里要注意,月份是从0开始。
intmonth=calendar.get(Calendar.MONTH);
//获取天
intday=calendar.get(Calendar.DAY_OF_MONTH);
}catch(ParseExceptione){
e.printStackTrace();
}

⑻ android中Uri.parse()用法是什么

  1. 调web浏览器
    Uri myBlogUri = Uri.parse("http://xxxxx.com");
    returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri);

  2. 地图

    Uri mapUri = Uri.parse("geo:38.899533,-77.036476");
    returnIt = new Intent(Intent.ACTION_VIEW, mapUri);

  3. 调拨打电话界面
    Uri telUri = Uri.parse("tel:100861");
    returnIt = new Intent(Intent.ACTION_DIAL, telUri);

  4. 直接拨打电话
    Uri callUri = Uri.parse("tel:100861");
    returnIt = new Intent(Intent.ACTION_CALL, callUri);

  5. 卸载
    Uri uninstallUri = Uri.fromParts("package", "xxx", null);
    returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

  6. 安装
    Uri installUri = Uri.fromParts("package", "xxx", null);
    returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

  7. 播放
    Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");
    returnIt = new Intent(Intent.ACTION_VIEW, playUri);

  8. 调用发邮件
    Uri emailUri = Uri.parse("mailto:[email protected]");
    returnIt = new Intent(Intent.ACTION_SENDTO, emailUri);

  9. 发邮件
    returnIt = new Intent(Intent.ACTION_SEND);

    String[] tos = { "[email protected]" };

    String[] ccs = { "[email protected]" };

    returnIt.putExtra(Intent.EXTRA_EMAIL, tos);

    returnIt.putExtra(Intent.EXTRA_CC, ccs);

    returnIt.putExtra(Intent.EXTRA_TEXT, "body");

    returnIt.putExtra(Intent.EXTRA_SUBJECT, "subject");

    returnIt.setType("message/rfc882");

    Intent.createChooser(returnIt, "Choose Email Client");

  10. 发短信

    Uri smsUri = Uri.parse("tel:100861");

    returnIt = new Intent(Intent.ACTION_VIEW, smsUri);

    returnIt.putExtra("sms_body", "yyyy");

    returnIt.setType("vnd.android-dir/mms-sms")

  11. 直接发邮件

    Uri smsToUri = Uri.parse("smsto://100861");

    returnIt = new Intent(Intent.ACTION_SENDTO, smsToUri);

    returnIt.putExtra("sms_body", "yyyy");

  12. 发彩信

    Uri mmsUri = Uri.parse("content://media/external/images/media/23");

    returnIt = new Intent(Intent.ACTION_SEND);

    returnIt.putExtra("sms_body", "yyyy");

    returnIt.putExtra(Intent.EXTRA_STREAM, mmsUri);

    returnIt.setType("image/png");

⑼ 在android中怎么使用pullparse解析.xml文件

Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:

按以下步骤进行操作:
[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="20110806100">
<name>小明</name>
<age>22</age>
<sex>男</sex>
</student>
<student id="20110806101">
<name>小李</name>
<age>24</age>
<sex>男</sex>
</student>
<student id="20110806102">
<name>小丽</name>
<age>21</age>
<sex>女</sex>
</student>
</students>

[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。
[html] view plain
package com.andyidea.entity;

public class Student {

private String id;
private String name;
private int age;
private String sex;

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}

}

[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。
[html] view plain
package com.andyidea.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Xml;

import com.andyidea.entity.Student;

public class ParserByPULL {

//采用XmlPullParser来解析XML文件
public static List<Student> getStudents(InputStream inStream) throws Throwable
{
List<Student> students = null;
Student mStudent = null;

//========创建XmlPullParser,有两种方式=======
//方式一:使用工厂类XmlPullParserFactory
XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = pullFactory.newPullParser();
//方式二:使用Android提供的实用工具类android.util.Xml
//XmlPullParser parser = Xml.newPullParser();

//解析文件输入流
parser.setInput(inStream, "UTF-8");
//产生第一个事件
int eventType = parser.getEventType();
//只要不是文档结束事件,就一直循环
while(eventType!=XmlPullParser.END_DOCUMENT)
{
switch (eventType)
{
//触发开始文档事件
case XmlPullParser.START_DOCUMENT:
students = new ArrayList<Student>();
break;
//触发开始元素事件
case XmlPullParser.START_TAG:
//获取解析器当前指向的元素的名称
String name = parser.getName();
if("student".equals(name))
{
//通过解析器获取id的元素值,并设置student的id
mStudent = new Student();
mStudent.setId(parser.getAttributeValue(0));
}
if(mStudent!=null)
{
if("name".equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudent.setName(parser.nextText());
}
if("age".equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudent.setAge(new Short(parser.nextText()));
}
if("sex".equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudent.setSex(parser.nextText());
}
}
break;
//触发结束元素事件
case XmlPullParser.END_TAG:
//
if("student".equals(parser.getName()))
{
students.add(mStudent);
mStudent = null;
}
break;
default:
break;
}
eventType = parser.next();
}
return students;
}

⑽ android中怎么解析复杂的xml文件

本文主要讲解Android开发中如何对XML文件的解析,由于XML文件具有与平台无关,广泛应用于数据通信中,因此解析XML文件就显得很有意义。Android对XML文件解析的方法主要有3种。 通常有三种方式:DOM、SAX和PULL,下面就分别针对这三种方式来进行讨论。

文件内容如下所示:
那么就是要对此XML文件做解析。下面我们就分别用DOM,SAX和PULL三种方式,分别对此XML文件做解析。

DOM方式

DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。由DOM解析的方式可以知道,如果XML文件很大的时候,处理效率就会变得比较低,这也是DOM方式的一个缺点。
现在我们来解析上文中提到的有关天气预报信息相关的xml文件。什么是解析呢?说的通俗一点,就是将这个带标签的XML文件识别出来,并抽取一些相关的,对我们有用的信息来给我们使用。那在这个文件里,时间,天气,温度,以及图标对我们来说是需要得到的。我们要对其做解析。
解析的具体思路是:
1. 将XML文件加载进来。
2. 获取文档的根节点
3. 获取文档根节点中所有子节点的列表
4. 获取子节点列表中需要读取的节点信息
根据这4个步骤,我们进行开发:
首先就是如何加载XML文件,假设此文件来源于网络。

SAX方式

SAX是Simple API for XML的缩写。是一个包也可以看成是一些接口。
相比于DOM而言SAX是一种速度更快,更有效,占用内存更少的解析XML文件的方法。它是逐行扫描,可以做到边扫描边解析,因此SAX可以在解析文档的任意时刻停止解析。非常适用于Android等移动设备。
SAX是基于事件驱动的。所谓事件驱动就是说,它不用解析完整个文档,在按内容顺序解析文档过程中,SAX会判断当前读到的字符是否符合XML文件语法中的某部分。如果符合某部分,则会触发事件。所谓触发事件,就是调用一些回调方法。当然android的事件机制是基于回调方法的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口。
这四个接口的详细说明如下:

事件处理器名称

事件处理器处理的事件

XMLReader注册方法

ContentHander

XML文档的开始与结束,
XML文档标签的开始与结束,接收字符数据,跳过实体,接收元素内容中可忽略的空白等。

setContentHandler(ContentHandler h)

DTDHander

处理DTD解析时产生的相应事件

setDTDHandler(DTDHandler h)

ErrorHandler

处理XML文档时产生的错误

setErrorHandler(ErrorHandler h)

EntityResolver

处理外部实体

setEntityResolver(EntityResolver e)

我们用来做内容解析的回调方法一般都定义在ContentHandler接口中。
ContentHandler接口常用的方法:
startDocument()
当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()
当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName,String qName, Attributes atts)
当读到开始标签的时候,会调用这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。
endElement(String uri, String localName, String name)
在遇到结束标签的时候,调用这个方法。
characters(char[] ch, int start, int length)
这个方法用来处理在XML文件中读到的内容。例如:<high data="30"/>主要目的是获取high标签中的值。
第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
注意:
SAX的一个重要特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下之前所碰到的标签,即在startElement()方法中,所有能够知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不知道的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM方便。
现在我们截取一段XML文件来做解析,其调用方法是这样的:
<?xml version="1.0"?> ----------> startDocument()
<weather> ----------> startElement
<forecast_information> ----------> startElement
<city> ----------> startElement
beijing ----------> characters
</city> ----------> endElement
</forecast_information > ----------> endElement
</weather > ----------> endElement
文档结束 ----------> endDocument()
SAX的解析步骤:
首先需要注意的是:
SAX还为其制定了一个Helper类:DefaultHandler它实现了ContentHandler这个接口,但是其所有的方法体都为空,在实现的时候,你只需要继承这个类,然后重载相应的方法即可。
使用SAX解析XML文件一般有以下五个步骤:
1、创建一个SAXParserFactory对象;
2、调用SAXParserFactory中的newSAXParser方法创建一个SAXParser对象;
3、然后在调用SAXParser中的getXMLReader方法获取一个XMLReader对象;
4、实例化一个DefaultHandler对象
5、连接事件源对象XMLReader到事件处理类DefaultHandler中
6、调用XMLReader的parse方法从输入源中获取到的xml数据
7、通过DefaultHandler返回我们需要的数据集合。
我们仍然来解析上述那个天气预报的XML文件。
编写代码如下:

[java] view plain
mySAX.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
try{
String url = "http://www.google.com/ig/api?&weather=beijing";
DefaultHttpClient client = new DefaultHttpClient();
HttpUriRequest req = new HttpGet(url);
HttpResponse resp = client.execute(req);
HttpEntity ent = resp.getEntity();
InputStream stream = ent.getContent(); //将文件导入流,因此用InputStream

SAXParserFactory saxFactory = SAXParserFactory.newInstance(); //获取一个对象
SAXParser saxParser = saxFactory.newSAXParser();//利用获取到的对象创建一个解析器
XMLContentHandler handler = new XMLContentHandler();//设置defaultHandler
saxParser.parse(stream, handler);//进行解析
stream.close();//关闭流
/*XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); //获取一个XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(stream));
stream.close();*/
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public class XMLContentHandler extends DefaultHandler {
private static final String TAG = "XMLContentHandler";

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.i(TAG, "解析内容:"+new String(ch,start,length));
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.i(TAG, "文档解析完毕。");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.i(TAG, localName+"解析完毕");
}
@Override
public void startDocument() throws SAXException {
Log.i(TAG, "开始解析... ...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.i(TAG, "解析元素:"+localName);

if(localName.equals("high")){
Log.i(TAG, "解析元素:"+localName);
i++;
if(i==2){
highestTmp.setText(String.valueOf((Integer.parseInt(attributes.getValue(0))-32)*5/9));
}
}
}
}

上面的那段注释:

[java] view plain
/*XMLReader xmlReader =saxFactory.newSAXParser().getXMLReader(); //获取一个XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(newInputSource(stream));
stream.close();*/

是用XMLReader来做解析的另外一种方法。效果是一样的。这里可以传流,也可以传一个字符串,如下所示:是传字符串。
[java] view plain
xmlReader.parse(new InputSource(new StringReader(xmlStr)));
PULL方式
除了可以使用 SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它也是事件触发的。Pull解析方式让应用程序完全控制文档该怎么样被解析。比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。
Pull解析是一个遍历文档的过程,每次调用next(),nextTag(), nextToken()和nextText()都会向前推进文档,并使Parser停留在某些事件上面,但是不能倒退。然后把文档设置给Parser。
Android中对Pull方法提供了支持的API,主要是
org.xmlpull.v1.XmlPullParser;
org.xmlpull.v1.XmlPullParserFactory;
二个类,其中主要使用的是XmlPullParser,XmlPullParserFactory是一个工厂,用于构建XmlPullParser对象。
应用程序通过调用XmlPullParser.next()等方法来产生Event,然后再处理Event。
我们仍然拿上述天气预报的XML文件的一部分来做例子。
例如:需要解析的XML文件是:

[java] view plain
<forecast_conditions>
<day_of_week data="周三"/>
<low data="22"/>
<high data="29"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="可能有雨"/>
</forecast_conditions>

这部分XML文件中day_of_week,low,high等是TAG,data是ATTRIBUTEA。当然,如果有<></>夹在开始和结束符号之间的部分,则为TXET。
要想解析文档先要构建一个XmlPullParser对象。

[java] view plain
final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
final XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader("xmlStr");

这里的xmlStr就是上边的XML文件。
此时,文档刚被初始化,所以它应该位于文档的开始,事件为START_DOCUMENT,可以通过XmlPullParser.getEventType()来获取。然后调用next()会产生
START_TAG,这个事件告诉应用程序一个标签已经开始了,调用getName()会返回" day_of_week ";若有TEXT,则再next()会产生TEXT事件,调用getText()会返回TEXT,由于此处没有,所以再next(),会产生END_TAG,这个告诉你一个标签已经处理完了,再next()直到最后处理完TAG,会产生END_DOCUMENT,它告诉你整个文档已经处理完成了。除了next()外,nextToken()也可以使用,只不过它会返回更加详细的事件,比如COMMENT, CDSECT, DOCDECL, ENTITY等等非常详细的信息。如果程序得到比较底层的信息,可以用nextToken()来驱动并处理详细的事件。需要注意一点的是TEXT事件是有可能返回空白的White Spaces比如换行符或空格等。
nextTag()--会忽略White Spaces,如果可以确定下一个是START_TAG或END_TAG,就可以调用nextTag()直接跳过去。通常它有二个用处:当START_TAG时,如果能确定这个TAG含有子TAG,那么就可以调用nextTag()产生子标签的START_TAG事件;当END_TAG时,如果确定不是文档结尾,就可以调用nextTag()产生下一个标签的START_TAG。在这二种情况下如果用next()会有TEXT事件,但返回的是换行符或空白符。
nextText()--只能在START_TAG时调用。当下一个元素是TEXT时,TEXT的内容会返回;当下一个元素是END_TAG时,也就是说这个标签的内容为空,那么空字串返回;这个方法返回后,Parser会停在END_TAG上。

小结一下,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式或DOM方式会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用PULL方式正合适。
当点击三种方式的任何一个按钮时,均能够得到相同的结果

热点内容
电脑怎样解压文件 发布:2025-05-15 22:25:32 浏览:437
dns服务器怎么看 发布:2025-05-15 22:17:27 浏览:149
3dm的压缩包 发布:2025-05-15 22:09:23 浏览:661
和存储字长 发布:2025-05-15 21:54:09 浏览:514
用什么写c语言 发布:2025-05-15 21:35:56 浏览:418
linux读取u盘 发布:2025-05-15 21:32:13 浏览:508
c语言dos 发布:2025-05-15 21:18:17 浏览:664
sci编译英文 发布:2025-05-15 21:16:57 浏览:383
大猫如何设置密码 发布:2025-05-15 21:15:32 浏览:765
什么叫苹果版的和安卓版的手机 发布:2025-05-15 21:05:18 浏览:254