小猪的Android入门之路 Day 8 part 1

小猪的Android入门之路
Day 8 part 1

Android网络编程浅析——xml文件的解析

---转载请注明出处:coder-pig

本节引言:

在不知不觉间,本系列的博客已经写到了第8天了,很多朋友反馈受益良多,帮到各位

笔者倍感欣慰,本来Day 8是想解析Android的图形与图像处理的,不过笔者想来想去,

还是决定先讲解下Android中的网络编程,因为有朋友提议讲解下网络方面的,所以

在Day 8中我们将会浅析Android在网络方面的一些应用,而本博客是面向初学者的,

而且鉴于笔者的水平,所以只是浅析,而非深入!在Day 8 中我们会讲解一些基本的

网络应用,如下载网络上的数据,图片,文件xml,Json,构建简单的客户端与服务端交

互等!而在Part 1中我们将详细地讲解XML与解析XML的常用方法!

本节学习路线图:

本节正文:

Android与互联网交互的三种方式:

XML文件要点介绍:

Android中解析XML的常用方法比较:

SAX解析XML文件:

SAX解析XML的流程

核心代码:

①SaxService.java:

package com.jay.example.service;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

import com.jay.example.bean.Person;

public class SaxService extends DefaultHandler{

	private Person person;
	private ArrayList<Person> persons;
	//当前解析的元素标签
	private String tagName = null;

	//当读取到文档开始标志时触发,通常在这里完成一些初始化操作
	@Override
	public void startDocument() throws SAXException {
		this.persons = new ArrayList<Person>();
		Log.i("SAX", "读取到文档头,开始解析xml");
	}

	//读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if(localName.equals("person"))
		{
			person = new Person();
			person.setId(Integer.parseInt(attributes.getValue("id")));
			Log.i("SAX", "读取标签");
		}
		this.tagName = localName;
	}

	//处理xml文件读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		//判断当前标签是否有效
		if(this.tagName != null)
		{
			String data = new String(ch,start,length);
			//读取标签中的内容
			if(this.tagName.equals("name"))
			{
				this.person.setName(data);
			}
			else if(this.tagName.equals("age"))
			{
				this.person.setAge(Integer.parseInt(data));
			}
		}
	}

	//文档结束部分,这里将对象添加到结合中
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if(localName.equals("person"))
		{
			this.persons.add(person);
			person = null;
		}
		this.tagName = null;
	}

	//获取persons集合
	public ArrayList<Person> getPersons()
	{
		return persons;
	}

}

②MainActivity中的readXML( )方法:

private ArrayList<Person> readxml() throws Exception
	{
		//获取文件资源建立输入流对象
		InputStream is = getAssets().open("persons.xml");
		//①创建XML解析处理器
		SaxService ss = new SaxService();
		//②得到SAX解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//③创建SAX解析器
		SAXParser parser = factory.newSAXParser();
		//④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器
		parser.parse(is,ss);
		is.close();
		return ss.getPersons();
	}

Dom解析xml文件

Dom解析xml的流程

核心代码:

dom解析xml的代码:

public static ArrayList<Person> queryXML(Context context)
	{
		ArrayList<Person> Persons = new ArrayList<Person>();

		try {
			//①获得DOM解析器的工厂示例:
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			//②从Dom工厂中获得dom解析器
			DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
			//③把要解析的xml文件读入Dom解析器
			Document doc = dbBuilder.parse(context.getAssets().open("persons2.xml"));
			System.out.println("处理该文档的DomImplemention对象=" + doc.getImplementation());
			//④得到文档中名称为person的元素的结点列表
			NodeList nList = doc.getElementsByTagName("person");
			//⑤遍历该集合,显示集合中的元素以及子元素的名字
			for(int i = 0;i < nList.getLength();i++)
			{
				//先从Person元素开始解析
				Element personElement = (Element) nList.item(i);
				Person p = new Person();
				p.setId(Integer.valueOf(personElement.getAttribute("id")));

				//获取person下的name和age的Note集合
				NodeList childNoList = personElement.getChildNodes();
				for(int j = 0;j < childNoList.getLength();j++)
				{
					Node childNode = childNoList.item(j);
					//判断子note类型是否为元素Note
					if(childNode.getNodeType() == Node.ELEMENT_NODE)
					{
						Element childElement = (Element) childNode;
						if("name".equals(childElement.getNodeName()))
							p.setName(childElement.getFirstChild().getNodeValue());
						else if("age".equals(childElement.getNodeName()))
							p.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));
					}
				}
				Persons.add(p);
			}
		} catch (Exception e) {e.printStackTrace();}
		return Persons;
	}

使用pull解析器解析XML文件

使用代码示例:

为了方便演示,将三种解析方法都打包到一个程序中:

分别使用三种方式解析xml文件,另外还有使用pull解析器生成xml文件,在data/data/<包名>/file目录下

可以找到生成的xml文件

效果图:

参考代码:代码下载

时间: 2024-08-05 07:08:11

小猪的Android入门之路 Day 8 part 1的相关文章

小猪的Android入门之路 Day 8 part 2

小猪的Android入门之路 Day 8 part 2 Android网络编程浅析--Android访问网络资源 --转载请注明出处:coder-pig 本节引言: 在part 1中我们学习了网络交互中用得较多的xml文件的相关概念,以及在Android中常用的 解析XML三种不同形式,分别SAX,DOM,Pull三种不同的解析方式;而在part 2中我们将会 讲解我们的应用如何去获取网络上的资源,分别是图片,HTML代码,XML代码和JSON数据; 好了,废话就这么多,开始本节的课程吧!从这p

小猪的Android入门之路 Day 8 part 4

小猪的Android入门之路 Day 8 part 4 Android网络编程浅析--Android网络数据的上传 --转载请注明出处:coder-pig 本节引言: 在part 3中我们已经学习了Android网络数据的下载,难点是多线程断点续传下载; 有下载,当然也有上传啦,本节就来研究下Android中的网络数据的上传! 1.使用GET或者Post方式上传数据给服务器 2.使用开源框架HttpClient上传数据到服务区 3.发送xml数据给服务器 4.通过Http协议上传文件 5.Web

小猪的Android入门之路 Day 4 - part 4

小猪的Android入门之路 Day 4 - part 4 Android事件处理机制之--事件处理机制拾遗 ------------转载请注明出处--coder-pig 本节引言: 在前面三个部分中,对于android的事件处理机制的学习已经学得七七八八了, 基于监听与回调的时间处理机制,以及使用Handler传递信息的机制都已经学了; 在最后这个部分中会对一些小的知识点进行补充,比如触摸事件的两种形式, Configuration类以及异步任务AsyncTask进行讲解,好了,开始本节的课程

小猪的Android入门之路 Day 3 - part 1

小猪的Android入门之路 Day 2 各种UI组件的学习 Part 1 本节引言: 在上一节中,我们初次体验了Android开发的一个流程,开发了一个简单的电话拨号器; 然后又学习了android的六大布局,界面无非是由布局 + 控件构成;布局都学了,剩下的 当然是控件啦,不过Android 所提供的UI组件还是比较丰富的;我们不求掌握他们的全部 用法,只需要了解一些基本的用法,等需要时再查资料就可以了!当然,内容是以android UI 组件实例大全为依托的,因为内容较多,所以需要分成几个

小猪的Android入门之路 Day 7 part 4

小猪的Android入门之路 Day 7 part 4 Android的数据存储与访问之--ContentProvider(内容提供者)                                   ---转载请注明出处:coder-pig 本节引言: 在前面的学习中,我们已经学习了一些存储数据的方式,而这些都是可以共享的,比如文件,我们可以把操作 模式设置为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE,其他应用 就可以

小猪的Android入门之路 Day 5 - part 1

小猪的Android入门之路 Day 5 - part 1 基本程序单元:Activity(活动) ------------转载请注明出处--coder-pig 本节引言: 经过前面的学习,我们已经可以开发出一个自定义简单UI界面以及具有简单逻辑业务的App了, 不过都是在一个界面上完成的,而现在大部分的app都是拥有多个界面的,所以我们有必要继续深入地 学习,而这些所谓的界面,窗口,在Android我们把他们叫做Activity(活动),他也是Android四大组件的其中 一个,是基本的程序单

小猪的Android入门之路 Day 4 - part 3

小猪的Android入门之路 Day 4 - part 3 Android事件处理机制之--Handler消息传递机制 ------------转载请注明出处--coder-pig 本节引言: 在前面两个部分中,我们对于android的两种事件处理机制:监听与回调进行了深入的学习; 貌似就学完android的事件处理机制了,其实这两个仅仅是发生了触摸啊之类做出的事件响应; 而今天这一Part要讲的是修改Activity中的UI组件时发生一些信息传递;相信大家都知道,我们只能够 主线程中去修改Ac

小猪的Android入门之路 Day 4 - part 1

小猪的Android入门之路 Day 4 - part 1 Android事件处理机制之--基于监听的事件处理机制 本节引言: 在开始本个章节前,我们先回顾下,现在我们已经知道了android的一些相关背景,一些常用的UI组件, 六大布局,现在的我们已经可以做出一个简单的app界面了,下一步就是逻辑与业务的实现了;在前面 的例子中我们曾经看到过setXXXListener这些东东,这个就是android 的事件处理,而这个方法是基于监听的 Android为我们提供了两套功能强大的事件处理机制:

小猪的Android入门之路 Day 6

小猪的Android入门之路 Day 6 Android应用核心:Intent(意图) -----转载请注明出处:coder-pig 本节引言: 通过前面的学习中,我们都知道可以调用startActivity(intent)或者startActivityForResult(intent) 来启动一个新的Activity了,他们的参数都是Intent类型的实例,那么这个Intent是什么东西呢? 有什么用?还有一个问题,相信细心的朋友都发现AndroidManifest.xml的activity标

小猪的Android入门之路 day 1

小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显得格外火爆, 作为一名快要毕业的IT屌丝,自然要趟一趟这一浑水啦,当前主流的手机系统 IOS(苹果),Android(安卓),WinPhone(windows);WindPhone貌似没什么崛起的势头; 所以主流的就是前面的两个;作为一名屌丝学生狗,买不起Mac,仅仅有一台双核的破电脑; 仅仅能去搞