Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 504|回复: 0

android xml文件解析 SAX-  Android学习

[复制链接]

该用户从未签到

发表于 2011-10-24 14:27:22 | 显示全部楼层 |阅读模式
XML文件解析
XML:可扩展标记语言。
有DOM和SAX两种解析方式,下面介绍SAX解析方式
SAX:
一、什么是SAX
全称:Simple API for XML,既是指一种接口,又是指一个软件包。
作为接口,SAX是事件驱动型XML解析的一个标准接口。
它是一个标准,用来解析XML文档。基于这项标准有各种各样的实现方法,有C++版本d 实现、java版本的实现。
优点:
1、逐行扫描文档,一边扫描一边解析
2、可以在解析文档的任意时刻来停止解析
缺点:
1、操作复杂
2、添加或删除内容比较麻烦
二、SAX基本原理
SAX的工作原理简单地说是对文档的顺序扫描,当扫描到文档开始与结束、元素开始与结束、文档结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
a)、在文档的开始和结束时触发文档处理事件。
b)、在文档内每一XML元素接受解析的前后触发元素事件
c)、任何元数据通常都由单独的事件交付
d)、在处理文档的DTD或Schema时产生DTD或Schema事件
e)、产生错误事件用来通知主机应用程序解析错误








三、SAX常用接口
每次产生一个事件都会触发相应的函数,我们要做的事情就是在这些函数里面写上处理元素的代码。
最常用的接口有ContentHandler。
ContentHandler是Java类包中一个特殊SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素的开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种:
返回值、方法名        描述        备注
void startDocument()        当开始读取文档时调用        
void endDocument()        当文档读取结束时调用        
void startElement(String uri,String localName,String qName,Attributes atts)        当开始读取一个元素(标签)时调用        
void endElement(String uri,String localName,String qName)        当读取完一个元素时调用        
void characters(char ch[],int start,int length)        当读取标签中间的内容时调用        

二、SAX解析示例
示例1:解析一个从网上下载下来的.xml文件,并在控制台输出解析出来的内容。
布局文件:
Xml代码
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    androidrientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView  

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    />

   

    <Button

            android:id="@+id/parseButton"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:text="paresButton"

    />

</LinearLayout>
复制代码文件解析类:
Java代码
package android.xml.sax;



import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;



public class MyContentHandler extends DefaultHandler {



        private String name,sex,age,tagName;

        

        @Override

        public void startDocument() throws SAXException {

                // TODO Auto-generated method stub

                super.startDocument();

                System.out.println("---------startDocument---------");

        }



        @Override

        public void endDocument() throws SAXException {

                // TODO Auto-generated method stub

                super.endDocument();

                System.out.println("---------endDocument---------");

        }



        

        @Override

        /**

         * 开始解析元素

         * String uri:URI的名称空间URI

         * String localName:不带前缀的元素(标签)名称

         * String name:带前缀的元素(标签)名称

         * Attributes attributes:标签的属性

         */

        public void startElement(String uri, String localName, String name,

                        Attributes attributes) throws SAXException {

                System.out.println("name: "+name);

                tagName = localName;

                if (tagName.equals("wroker")){

                        for(int i =0;i<attributes.getLength();i++){

                                //第i个属性的名字,和第i个属性的值

                                System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i));

                        }

                }

        }



        @Override

        public void endElement(String uri, String localName, String name)

                        throws SAXException {

                // 在worker解析完之后,会打印出所有得到的数据

                if (localName.equals("worker")){

                        printout();

                }

        }



        @Override

        /**

         * 得到标签中间的内容

         * char[] ch:标签里的内容(标签内读取出来的内容都会放在这个数组里面)

         * int start:字符数组的起始位置(从数组的哪一位开始)

         * int length:字符数组的起始位置(到后面多少位)

         */

        public void characters(char[] ch, int start, int length)

                        throws SAXException {

                if (tagName.equals("name"))

                        name = new String(ch,start,length);

                else if (tagName.endsWith("sex"))

                        sex = new String(ch,start,length);

                else

                        age = new String(ch,start,length);

        }

        

        public void printout(){

                System.out.println("name: "+name);

                System.out.println("sex: "+sex);

                System.out.println("age: "+age);

        }

}
复制代码Activity类:
Java代码
package android.xml.sax;



import java.io.IOException;

import java.io.Reader;

import java.io.StringReader;



import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParserFactory;



import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;



import android.app.Activity;

import android.os.Bundle;

import android.utils.HttpDownloader;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;



public class XMLSAXTest extends Activity {

    /** Called when the activity is first created. */

        

        private Button parseButton = null;

        

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        parseButton = (Button)findViewById(R.id.parseButton);

        parseButton.setOnClickListener(new ParesButtonOnClickListener());

    }

   

    class ParesButtonOnClickListener implements OnClickListener{

                public void onClick(View v) {

                        // TODO Auto-generated method stub

                        HttpDownloader hd = new HttpDownloader();

                        String resultStr = hd.download("http://dl5.csdn.net/fd.php?i=768128918158274&s=5a92e2d55af5561a2bb3c16216cc2771");

                        System.out.println("resultStr: "+resultStr);

                        try {

                                //创建一个SAXParesFactory工厂对象

                                SAXParserFactory factory = SAXParserFactory.newInstance();

                                //创建一个XMLReader对象

                                XMLReader xmlReader = factory.newSAXParser().getXMLReader();

                                //为XMLReader设置内容处理器

                                xmlReader.setContentHandler(new MyContentHandler());

                                //开始解析文件

                                xmlReader.parse(new InputSource(new StringReader(resultStr)));

                        } catch (Exception e) {

                                e.printStackTrace();

                        }

                        

                }

    }

}
复制代码




除此之外还需要上传文件的类,前面已经写过了在这里就不贴代码了


项目源码已经上传,有需要的可以下载。

XML_SAXTest.rar (51.88 KB, 下载次数: 2)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 10:58 , Processed in 0.363938 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表