android开发基础教程—三种方式实现xml文件解析_安卓软件开发教程-查字典教程网
android开发基础教程—三种方式实现xml文件解析
android开发基础教程—三种方式实现xml文件解析
发布时间:2016-12-28 来源:查字典编辑
摘要:1.sax方式复制代码代码如下:/***使用sax解析*/publicclassSaxParse{/***sax解析器*/privateSA...

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;

}

}

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新安卓软件开发学习
    热门安卓软件开发学习
    编程开发子分类