`
androidtoast
  • 浏览: 211694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
38befa0e-3f74-3314-92d9-475c7fc3c19b
Android学习——入门...
浏览量:125234
社区版块
存档分类
最新评论

六,Android Xml解析

阅读更多

 

Android程序中,Xml解析与Java中几乎相同,最常用的有SAXDOMPULL 三种解析方式。Android中内置了pull解析方式。这也是android推荐的解析方式。下面我们就看下这三种的用法,与不同

1SAX:(Simple API for XML这种解析方式基于事件的模型。通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应触发不同方法来处理。它属于一次加载。它可以处理任意大小的XML文件,它对内存的要求非常低,因为SAX采用的是读取文件的方式,也就是当它是文本文件在读,读完就完了,什么信息都没有保存。当然它也有其缺点,解析过程中无法中断,只能读取XML文件而不能修改,编码上也相对复杂与难于理解。它的常用方法:

void startDocument()//文档开始时触发该方法

void endDocument()//文档结束时

void startElement(String uri, String localName, String qName, Attributes atts)//元素开始

void endElement(String uri, String localName, String qName)//元素结束

void characters(char[ ] ch, int start, int length)//文本节点

创建SAX解析器:

  (1)用系统默认值来创建一个XMLReader(解析器):

  XMLReader reader = XMLReaderFactory.createXMLReader();

  (2)从给定的类名称来创建一个XMLReader

  XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");

  (3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:

  SAXParserFactory spFactory = SAXParserFactory.newInstance();

SAXParser sParser = spFactory.newSAXParser();

2DOM:(Document Object Model文档对象模型,它是基于对象的,又或者基于树的。它属于两次加载,首先把文档载入内存,第二次把文档解析形成一棵树。如果文档过大对内存占用是很大的。但它也有其优点,它可以解析的过程中修改文件树,可以随便存储文件树的任意部分,相对容易理解。

3Pull解析:android中内置了pull解析包。这也是android程序中所推荐的xml解析方式。从它的字面上就可以看出来,其优点,pull,拉的意思。我要什么资源我就拿什么资源。我只需要xml文件中一部分,我就拉一部分。从而节省资源,提高效率。当然在J2EE中也可以使用Pull解析。Pull解析也非常易于理解。

 

先上图:


 

我们就用这三种方式对同一个XML文件进行解析:

<?xml version="1.0"?>
	<persons>
		<person id="1">
			<name>tom</name>
			<age>13</age>
		</person>
		<person id="2">
			<name>jerry</name>
			<age>14</age>
		</person>
		<person id="3">
			<name>john</name>
			<age>34</age>
		</person>
	</persons>

 SAX解析代码:

package com.iteye.androidtoast.resolver;


import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

import com.iteye.androidtaost.model.Person;
import com.iteye.androidtaost.service.ParseService;

public class Sax implements ParseService{
	/*SAX解析,是基于事件的,一次性加载*/
	private SAXParser parser;
	
	public Sax(){
		//实例化解析工厂
		SAXParserFactory f=SAXParserFactory.newInstance();
		try {
			parser=f.newSAXParser();
		} catch (Exception e) {
			e.printStackTrace();
			Log.i("Sax",e.getMessage());
		}
	}
	@Override
	public List<Person> doParse(InputStream in) {
		XmlHandler h=new XmlHandler();
		try {
			parser.parse(in, h);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		return h.getPersons();
	}
	
	/*
	 * 处理器
	 */
	class XmlHandler extends DefaultHandler{
		List<Person> persons=null;
		private Person p;
		private Object currentEleName;
		
		
		/**
		 * 开始解析文档的时候实例化集合
		 */
		@Override
		public void startDocument() throws SAXException {
			persons=new ArrayList<Person>();
		}

		@Override
		public void endDocument() throws SAXException {
			// TODO Auto-generated method stub
			super.endDocument();
		}

		/**
		 * 元素开始
		 */
		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if("person".equals(localName)){
				p = new Person();//节点开始的时候实例化person
				p.id=new Integer(attributes.getValue(0));//得到ID
			}else if("name".equals(localName)){
				this.currentEleName="name";
			}else if("age".equals(localName)){
				this.currentEleName="age";
			}
				
		}

		/**
		 * 元素结束事件
		 */
		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			//解析到文档末尾
			if("person".equals(localName)){
				//将解析完成的对象添加到集合
				persons.add(p);
			}else if("name".equals(localName)||"age".equals(localName)){
				this.currentEleName="";
			}
		}

		/**)
		 * 用户处理字符节点
		 */
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			String str=new String(ch,start,length);
			if("name".equals(currentEleName)){
				p.name=str;
			}else if("age".equals(currentEleName)){
				p.age=new Integer(str);
			}
		}
		
		public List<Person> getPersons(){
			return persons;
		}
		
	}
	
}

 DOM解析代码:

package com.iteye.androidtoast.resolver;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.iteye.androidtaost.model.Person;
import com.iteye.androidtaost.service.ParseService;
/*
 * DOM解析
 */
public class Dom implements ParseService{

	/**
	 * 文档构建器
	 */
	private DocumentBuilder builder;
	private Person person;
	
	public Dom(){
		//获取构建器
		DocumentBuilderFactory f=DocumentBuilderFactory.newInstance();
		try {
			builder=f.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
	}
	@Override
	public List<Person> doParse(InputStream in) {
		List<Person> persons=new ArrayList<Person>();
		try {
			Document doc=builder.parse(in);
			NodeList list=doc.getElementsByTagName("person");
			for(int i=0;i<list.getLength();i++){
				//提取Person元素
				Element el=(Element) list.item(i);
				person = new Person();
				//获取ID节点
				person.id=new Integer(el.getAttribute("id"));
				person.name=getSubelementTextContentByName(el,"name");
				person.age=new Integer(getSubelementTextContentByName(el,"age"));
				
				persons.add(person);
			}
			return persons;
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 得到指定元素的子元素文本 节点(
	 * @param el 父元素
	 * @param name 子元素名称 
	 * @return
	 */
	private String getSubelementTextContentByName(Element el, String name) {
		NodeList list=el.getElementsByTagName(name);
		Element e=(Element) list.item(0);
		return e.getTextContent(); 
	}



}

 Pull解析代码:

package com.iteye.androidtoast.resolver;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Xml;

import com.iteye.androidtaost.model.Person;
import com.iteye.androidtaost.service.ParseService;

public class Pull implements ParseService{

	private String tagName;

	@Override
	public List<Person> doParse(InputStream in) {
		List<Person> persons=null;
		Person person=null;
		
		XmlPullParser parser=Xml.newPullParser();
		try {
			parser.setInput(in, "utf-8");
			//获取事件类型
			int eventType=parser.getEventType();
			
			while(eventType!=XmlPullParser.END_DOCUMENT){
				switch(eventType){
				//文档开始
				case XmlPullParser.START_DOCUMENT:
					 persons=new ArrayList<Person>();
					 break;
				case XmlPullParser.START_TAG:
					tagName = parser.getName();
					if("person".equals(tagName)){
						person=new Person();
						person.id=new Integer(parser.getAttributeValue(0));
					}else if("name".equals(tagName)){
						person.name=parser.nextText();
					}else if("age".equals(tagName)){
						person.age=new Integer(parser.nextText());
					}
					break;
				case XmlPullParser.END_TAG:
					if("person".equals(parser.getName())){
						persons.add(person);
					}
					break;
				}
				eventType=parser.next();
			}
			
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return persons;
	}
	
}
 

 

 

  • 大小: 176.5 KB
15
1
分享到:

相关推荐

    android xml pull解析示例

    在Android系统中,XML Pull解析是一种轻量级且高效的解析XML文档的方法,它允许应用程序按需读取XML文档的节点,而无需加载整个文档到内存中。以下是关于Android XML Pull解析的详细知识讲解。 1. **XML Pull解析器...

    android下解析xml文件的demo

    在Android应用中,我们通常使用两种方式来解析XML:DOM(Document Object Model)解析器和SAX(Simple API for XML)解析器。 1. DOM解析: DOM解析器将整个XML文件加载到内存中,形成一个树形结构,可以方便地遍历...

    Android xml 解析工具类

    Android XML 解析工具类 Android XML 解析工具类是一个功能强大且实用的工具类,提供了多种方法来解析 XML 文档。该工具类提供了四种方法来获取 XML 节点的内容,分别是 getMarkString、getMarkString、...

    android xml多种解析生成

    Android XML 多种解析生成 Android 平台中,XML 文件解析和生成是非常重要的一部分。XML 文件可以存储和交换结构化数据,广泛应用于 Android 应用程序中。本文将介绍 Android 中使用多种解析和生成 XML 文件的方法...

    Android XML 解析 写入

    本篇将详细探讨Android中的XML解析,特别是PULL解析方式,并讲解如何进行XML的写入操作。 ### 1. Android XML解析概述 XML解析器分为两种主要类型:DOM(Document Object Model)和PULL(Pull Parser)。DOM解析器...

    Android XML解析(DOM、PULL、SAX三种方式)

    Android系统提供了三种主要的XML解析方式:DOM(Document Object Model)、PULL(Pull Parser)和SAX(Simple API for XML)。每种方法都有其独特的特性和应用场景,下面将详细介绍这三种XML解析方式。 1. DOM解析...

    Android XML 解析笔记

    Android支持多种XML解析技术,包括DOM、SAX和Pull解析。每种方法都有其特定的优势和应用场景。 #### DOM解析XML DOM(Document Object Model)解析是一种将整个XML文档加载到内存中,并构建出一棵树状结构(称为DOM...

    Android XML解析源码

    解析安卓的strings xml colors xml dimens xml等 共4个方法 String[] getStringArray InputStream String String getString InputStream String String getColor InputStream String String getDimens ...

    android XML三种解析及生成

    本文将深入探讨Android中的三种XML解析方式:SAX(Simple API for XML)、Pull Parser和DOM(Document Object Model),以及如何生成XML文件。 ### 1. SAX解析 SAX解析器是基于事件驱动的解析模型,它逐行读取XML...

    android java xml 解析生成jar

    本主题将详细讲解如何在Android环境中利用Java进行XML解析,并生成JDOM库的jar文件。 XML解析在Android中的重要性不言而喻,因为XML常被用来描述应用程序的配置、布局,甚至是网络通信的数据交换格式。Java提供了...

    android xml文件解析 SAX

    SAX是一种事件驱动的XML解析器,它不会像DOM解析器那样将整个XML文档加载到内存中,而是逐行读取,遇到每个元素或属性时触发相应的事件回调。这种方式节省了内存,特别适合处理大型XML文件。 1. **SAX解析的基本...

    Android解析XML文件

    本例使用多种方式获取本地XML文件,还有通过url获取XML文件,使用Android内置的PULL解析器对XML文件进行解析,例子是解析我国各个省市。 《Android解析XML文件》博文路径:...

    android xml解析1

    在JAVA中有两种常见的XML解析方式,DOM和SAX,DOM在解析的时候会将所有的数据一次性载入内存中进行解析,在数据量比较大的情况下,效率非常低.尤其在手机这种对内存和性能要求比较苛刻的设备里面这种方法并不可取. ...

    Android XML解析之SAX解析

    在Android中,有多种解析XML的方法,如DOM、SAX和Pull解析器。本篇主要讨论的是SAX解析,这是一种基于事件驱动的、高效的解析方式,适合处理大体积的XML文件。 SAX解析器逐行读取XML文档,当遇到开始标签、结束标签...

    android XML本地解析实例

    二、Android中的XML解析实例 1. DOM解析实例: ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = ...

    Android Dom解析XML

    本文将深入探讨如何使用DOM(Document Object Model)解析XML在Android应用中的实践。DOM解析方式允许开发者一次性加载整个XML文档到内存中,形成一个树形结构,便于遍历和操作。尽管对于大型XML文件,DOM解析可能因...

    Android中解析XML

    昨两天偶然在csdn上学习到Android中解析XML,感觉博主写得清晰易懂,但是未有源码,于是自己整理了一下。学习参考:http://blog.csdn.net/liuhe688/article/details/6415593/

    Android 解析xml实现类似网易客户端源码

    首先,让我们了解XML解析的基本概念,然后探讨在Android中实现这一功能的关键技术和步骤。 XML是一种自描述性的标记语言,它允许我们定义自己的标签来表示数据。在Android中,有两种主要的XML解析方式:DOM...

    Android 封装pull解析xml

    本篇文章将详细介绍如何在Android中封装一个基于Pull解析的XML处理工具,并演示如何直接调用这个工具进行XML解析。 Android支持两种主要的XML解析方式:DOM(Document Object Model)解析和SAX(Simple API for XML...

Global site tag (gtag.js) - Google Analytics