开源中文网

您的位置: 首页 > Android开发 > 正文

android开发基础教程—三种方式实现xml文件解析

来源: 网络整理  作者: 佚名

本文将介绍三种方式:sax方式/dom方式/pull方式实现xml文件解析:
1.sax方式 

代码如下:

/** 
* 使用sax解析 
*/ 
public class SaxParse{ 
/** 
* sax解析器 
*/ 
private SAXParser parser; 
public SaxParse(){ 
try { 
SAXParserFactory f = SAXParserFactory.newInstance(); 
parser = f.newSAXParser(); 
} catch (ParserConfigurationException e) { 
e.printStackTrace(); 
} catch (Exception e) { 
e.printStackTrace(); 


public List<Person> doParse(InputStream is) { 
try { 
XmlHandler h = new XmlHandler(); 
parser.parse(is,h); 
return h.getpersons(); 
} catch (Exception e) { 
e.printStackTrace(); 

return null; 

/** 
* 处理器 
*/ 
class XmlHandler extends DefaultHandler{ 
List<Person> persons = null ; 
Person person = null ; 
//当前元素名称 
private String currEleName; 
/** 
* 文本节点触发该方法 
*/ 
public void characters(char[] ch, int start, int length)throws SAXException { 
String str = new String(ch,start,length); 
//name 
if("name".equals(currEleName)){ 
person.name = str ; 

else if("age".equals(currEleName)){ 
person.age = Integer.parseInt(str); 


public void endDocument() throws SAXException { 

/** 
* 元素结束 
*/ 
public void endElement(String uri, String localName, String qName) 
throws SAXException { 
if("person".equals(localName)){ 
persons.add(person); 

//将当前元素置空 
else if(("name".equals(currEleName)) || ("age".equals(currEleName))){ 
this.currEleName = "" ; 


/** 
* 文档开始事件 
*/ 
public void startDocument() throws SAXException { 
persons = new ArrayList<Person>(); 

/** 
* 元素开始事件 
* localName:本地名 
* uri:名字空间 
* qName:限定名,前缀 + 本地名 
*/ 
public void startElement(String uri, String localName, String qName, 
Attributes attributes) throws SAXException { 
//实例化person对象 
if("person".equals(localName)){ 
person = new Person(); 
person.id = Integer.parseInt(attributes.getValue(0)); 

//name元素 
else if("name".equals(localName)){ 
this.currEleName = "name" ; 

//name元素 
else if("age".equals(localName)){ 
this.currEleName = "age" ; 


public List<Person> getpersons(){ 
return persons ; 



2.dom方式 
代码如下:

/** 
* DOM解析 
*/ 
public class DomParse{ 
// 
private DocumentBuilder builder; 
public DomParse(){ 
try { 
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); 
this.builder = f.newDocumentBuilder(); 
} catch (Exception e) { 
e.printStackTrace(); 


public List<Person> doParse(InputStream is) { 
List<Person> persons = new ArrayList<Person>(); 
Person person = null ; 
try { 
Document doc = builder.parse(is); 
NodeList list = doc.getElementsByTagName("person"); 
Element ele = null ; 
for(int i = 0 ; i < list.getLength() ; i ++){ 
ele = (Element) list.item(i); 
person = new Person(); 
person.id = Integer.parseInt(ele.getAttribute("id")); 
person.name = getSubElementTextContent(ele,"name"); 
person.age = Integer.parseInt(getSubElementTextContent(ele,"age")); 
persons.add(person); 

} catch (Exception e) { 
e.printStackTrace(); 

return persons; 

/** 
* 得到指定的资源中中间的文本内容 
*/ 
private String getSubElementTextContent(Element ele, String tagName) { 
NodeList list = ele.getElementsByTagName(tagName); 
Element e = (Element) list.item(0); 
//得到中间的文本节点 
return e.getTextContent(); 


3.pull方式 
代码如下:

/** 
* pull解析,拉模式,可以手动控制下一个事件是否触发. 
*/ 
public class PullParse{ 
public List<Person> doParse(InputStream is) { 
List<Person> persons = null ; 
Person person = null ; 
try { 
XmlPullParser parser = Xml.newPullParser(); 
//设置解析数据源 
parser.setInput(is, "utf-8"); 
//取得事件的类型 
int eventType = parser.getEventType(); 
String eleName = null ; 
while(eventType != XmlPullParser.END_DOCUMENT){ 
switch(eventType){ 
//文档开始 
case XmlPullParser.START_DOCUMENT: 
persons = new ArrayList<Person>(); 
break ; 
//元素开始 
case XmlPullParser.START_TAG: 
eleName = parser.getName(); 
if("person".equals(eleName)){ 
person = new Person(); 
person.id = Integer.parseInt(parser.getAttributeValue(0)); 

else if("name".equals(eleName)){ 
person.name = parser.nextText(); 

else if("age".equals(eleName)){ 
person.age = Integer.parseInt(parser.nextText()); 

break ; 
//标记结束 
case XmlPullParser.END_TAG: 
eleName = parser.getName(); 
if("person".equals(eleName)){ 
persons.add(person); 

break ; 

//手动激活下个事件的触发 
eventType = parser.next(); 

} catch (Exception e) { 
e.printStackTrace(); 

return persons; 

Tags:方式 文件 基础
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明