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