文档章节

《android用SAX解析xml》

吕檀溪
 吕檀溪
发布于 2014/04/01 08:37
字数 940
阅读 50
收藏 5

主要的Acivity

package com.xml.xml;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
 * 主Activity
 * @author 吕檀溪
 *
 */
public class MainActivity extends Activity {
 private Button but;
 public static List<Map<String, String>> list=new ArrayList<Map<String,String>>();
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  but=(Button) findViewById(R.id.but);
  
  but.setOnClickListener(new ButtonClick());
 }
 class ButtonClick implements OnClickListener{
  @Override
  public void onClick(View view) {
    //得到产生SAX的生产工厂
    SAXParserFactory  factory=SAXParserFactory.newInstance();
    try {
     //得到获取XML的对象
     XMLReader reader=factory.newSAXParser().getXMLReader();
     //绑定读书数据的类
     reader.setContentHandler(new MySaxRead());
     //获取需要读取的.xml文件
     reader.parse(new InputSource(MainActivity.class.getClassLoader().getResourceAsStream("user.xml")));
     //绑定数据
     Intent intent=new Intent();
     intent.putExtra("list", (Serializable)list);
     intent.setClass(MainActivity.this, ArrayActivity.class);
     startActivity(intent);
    } catch (Exception e) {
     e.printStackTrace();
    } 
  }
  
 }
}

解析xml的Acitity

package com.xml.xml;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * 读取xml文件的类,继承了DefaultHandler
 * 这里的五个方法都是从DefaultHandler重写的
 * @author 吕檀溪
 *
 */
public class MySaxRead extends DefaultHandler{
 private String tagName;
 private List<Map<String, String>> list=new ArrayList<Map<String,String>>();
 private  String name;
 //结束Document的方法,并给MainActivity连的list赋值
 @Override
 public void endDocument() throws SAXException {
  MainActivity.list=this.list;
  
 }
 //结束标签的读取,并给结束标签添加一个标记
 @Override
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  tagName=File.separator+localName;
 }
 //开始读取内容
 @Override
 public void startDocument() throws SAXException {
 }
 //开始读取标签
 @Override
 public void startElement(String uri, String localName, String qName,
   Attributes attr) throws SAXException {
  //获取没有前缀的标签名
  tagName=localName;
  //判断是否是我们需要的标签
  if("worker".equals(tagName)){
   //循环得到标签的属性
   for (int i = 0; i < attr.getLength(); i++) {
    System.out.println(attr.getLocalName(i)+"=="+attr.getValue(i));
   }
  }
 }
 
 //得到便签的值
 @Override
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  if("name".equals(tagName)){
   name=new String(ch, start, length);
  }else if("age".equals(tagName)){
   //这个步骤很关键,因为这里没做好就会出现空值的现象;这里是先把name的值存在全局变量中
   //然后在根据age的非空值一起存进map集合
   Map<String, String> map=new HashMap<String, String>();
   String age=new String(ch, start, length);
   map.put("name", name);
   map.put("age", age);
   list.add(map);
  }
 }
 
}

列表显示的Activity

package com.xml.xml;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.SimpleAdapter;
/**
 * 做一个列表显示
 * @author 吕檀溪
 *
 */
public class ArrayActivity extends ListActivity{
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.array);
  //得到传过来得到Intent
  Intent intent=getIntent();
  //得到在Intent绑定数数据
  List<Map<String, String>> list=(List<Map<String, String>>) intent.getSerializableExtra("list");
  //给SimpleAdapter绑定需要显示的数据,以及制定显示的规范
  SimpleAdapter adapter=new SimpleAdapter(this, list, R.layout.user, new String[]{"name","age"}, new int[]{R.id.name,R.id.age});
  setListAdapter(adapter);
 }
 
}

主要的布局文件main.xml

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

    xmlns:tools="
http://schemas.android.com/tools
"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

 <Button 

     android:id="@+id/but"

     android:layout_height="wrap_content"

     android:layout_width="wrap_content"

     android:text="解析XML"

     />

</RelativeLayout>

配置需要列表显示的文件

1、申明列表文件array.xml

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

    xmlns:tools="
http://schemas.android.com/tools
"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

  >

  <ListView 

      android:id="@+id/android:list"

      android:layout_height="wrap_content"

      android:layout_width="fill_parent"

      android:drawSelectorOnTop="false"

      android:scrollbars="vertical"

      ></ListView>

</LinearLayout>

2、数据显示文件user.xml

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

    xmlns:tools="
http://schemas.android.com/tools
"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="horizontal" 

  >

 

  <TextView 

      android:id="@+id/name"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:layout_marginLeft="20pt"

      />

  <TextView 

      android:id="@+id/age"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

       android:layout_marginLeft="20pt"

      />

</LinearLayout>

注册Activity的文件AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xml.xml"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="18" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xml.xml.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.xml.xml.ArrayActivity"></activity>
    </application>
</manifest>

最后是需要解析的xml文件user.xml,放在src文件目录下

<?xml version="1.0" encoding="utf-8"?>

<workers>

    <worker id="001" nameMy="001x">

        <name>迈克儿.乔丹</name>

        <age>17</age>

    </worker>

    <worker id="002" nameMy="002x">

        <name>周杰伦</name>

        <age>18</age>

    </worker>

</workers>

© 著作权归作者所有

共有 人打赏支持
吕檀溪
粉丝 5
博文 54
码字总数 32623
作品 0
成都
程序员
私信 提问
Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。 XML,相关有DOM、SAX、JDOM、DOM4J、Xerce...

长平狐
2013/01/06
159
0
Android读写XML(上)

注明:本文转自http://www.moandroid.com. 原文地址: http://www.moandroid.com/?p=508 XML 经常用作 Internet 上的一种数据格式,其文件格式想必大家都比较清楚,在这里我结合Android平台,...

晨曦之光
2012/03/01
391
0
Android 创建与解析XML(六)—— 比较与使用

前面介绍了四种创建、解析XML的方式: 0、 Android 创建与解析XML(一)—— 概述 1、 Android 创建与解析XML(二)—— Dom方式 2、 Android 创建与解析XML(三)—— Sax方式 3、 Android ...

长平狐
2013/01/06
1K
0
Android之SAX解析xml

SAX全称simple API for XML,同DOM一样也是一个访问XML文档的接口。SAX并不是一个实际可以直接对XML进行解析的解析器,而是他兼容SAX的解析器要实现的接口帮助类的集合。实现了SAX的解析器有很...

哈全文
2012/05/21
0
0
Android高手进阶教程(二十一)之---Android中创建与几种解析xml的方法!

大家好今天我今天给大家讲解一下android中xml的创建以及一些解析xml的常用方法。 首先是创建,我们用XmlSerializer这个类来创建一个xml文件,其次是解析xml文件,常用的有dom,sax,XmlPullPa...

迷途d书童
2012/02/29
301
1

没有更多内容

加载失败,请刷新页面

加载更多

Kubernetes 1.13.0的快速升级

Kubernetes 1.13.0已经正式发布,快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kubelet版本、拉取镜像、升级Kubernetes集群三个主要步骤。注意Kubernetes 1.13.0版本暂时不支...

openthings
13分钟前
0
0
go的卸载和环境变量配个人.bashrc

若是用安装包直接解压 http://download.csdn.net/detail/u010026901/7592581 cd /usr/local tar -zxvf go1.1.2.linux-386.tar.gz(先把安装包移到这个目录) 3.安装 $ cd go/src,$ ./all.b......

dragon_tech
18分钟前
0
0
区块链安全 - 以太坊短地址攻击

1 基础知识 EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档: https://github.com/ethereum/wiki/wiki/Ethereum-C...

HiBlock
29分钟前
1
0
自定义函数及内部函数

变量的作用域 局部变量 global $Global及其他超全局数组 静态变量 仅初始化赋值 保留于内存直到response才销毁 global和static变量的区别 global:局部变量全局话 static:定义静态局部变量 函...

关元
30分钟前
1
0

中国龙-扬科
42分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部