Android网络编程浅析——xml文件的解析
---转载请注明出处:coder-pig
本节引言:
在不知不觉间,本系列的博客已经写到了第8天了,很多朋友反馈受益良多,帮到各位
笔者倍感欣慰,本来Day 8是想解析Android的图形与图像处理的,不过笔者想来想去,
还是决定先讲解下Android中的网络编程,因为有朋友提议讲解下网络方面的,所以
在Day 8中我们将会浅析Android在网络方面的一些应用,而本博客是面向初学者的,
而且鉴于笔者的水平,所以只是浅析,而非深入!在Day 8 中我们会讲解一些基本的
网络应用,如下载网络上的数据,图片,文件xml,Json,构建简单的客户端与服务端交
互等!而在Part 1中我们将详细地讲解XML与解析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;
	}
	
}
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的代码:
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;
	}
为了方便演示,将三种解析方法都打包到一个程序中:
分别使用三种方式解析xml文件,另外还有使用pull解析器生成xml文件,在data/data/<包名>/file目录下
可以找到生成的xml文件
效果图:
参考代码:代码下载
原文地址:http://blog.csdn.net/coder_pig/article/details/38922593