小猪的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文件


效果图:



参考代码:代码下载














郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。