`
myclover
  • 浏览: 195666 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android中使用SAX和DOM以及Pull对xml文件进行解析

阅读更多
分别对Sax、Dom、Pull三种技术解析xml文件的实例,以及使用Pull保存xml文件。

person.xml
<?xml version="1.0" encoding="utf-8"?>
<persons>
	<person id="1001">
		<name>张三</name>
		<age>22</age>
		<sex>男</sex>
	</person>
	<person id="1002">
		<name>李四</name>
		<age>21</age>
		<sex>女</sex>
	</person>
	<person id="1003">
		<name>王五</name>
		<age>23</age>
		<sex>男</sex>
	</person>
	<person id="1004">
		<name>赵六</name>
		<age>24</age>
		<sex>女</sex>
	</person>
	<person id="1005">
		<name>孙七</name>
		<age>21</age>
		<sex>女</sex>
	</person>
</persons>


package com.myclover.xml.service;

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 com.myclover.xml.bean.Person;

/**
 * 使用Sax技术解析XML文件
 * 
 * @author myclover
 * 
 */
public class SAXParseXml {

	/**
	 * 功能描述: 通过Sax解析XML文件 xml文件格式如下: <?xml version="1.0" encoding="utf-8"?>
	 * <persons> <person id="1001"> <name>张三</name> <age>22</age> <sex>男</sex>
	 * </person> </persons>
	 * 
	 * @param ins
	 *            XML文件输入流
	 * @return 返回值:xml文件中的数据集合
	 * @throws Exception
	 */
	public List<Person> getPersonList(InputStream ins) throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		PersonHandler handler = new PersonHandler();
		parser.parse(ins, handler);
		return handler.getPersons();
	}

	// 定义一个内部类继承DefaultHandler
	private final class PersonHandler extends DefaultHandler {

		private List<Person> persons;
		private Person person;
		private String tag;

		public List<Person> getPersons() {
			return persons;
		}

		@Override
		public void startDocument() throws SAXException {
			persons = new ArrayList<Person>();
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if ("person".equals(localName)) {
				person = new Person();
				person.setId(new Integer(attributes.getValue(0)));
			}
			tag = localName;
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			if (tag != null) {
				String data = new String(ch, start, length);
				if ("name".equals(tag)) {
					person.setName(data);
				} else if ("age".equals(tag)) {
					person.setAge(new Integer(data));
				} else if ("sex".equals(tag)) {
					person.setSex(data);
				}
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if ("person".equals(localName)) {
				persons.add(person);
				person = null;
			}
			tag = null;
		}

	}

}


package com.myclover.xml.service;

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

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Log;
import android.util.Xml;
import com.myclover.xml.bean.Person;

/**
 * 使用Pull技术解析和保存XML文件
 * 
 * @author myclover
 * 
 */
@SuppressWarnings("all")
public class PullParseXml {

	/**
	 * 功能描述: 通过Pull解析XML文件 xml文件格式如下: <?xml version="1.0" encoding="utf-8"?>
	 * <persons> <person id="1001"> <name>张三</name> <age>22</age> <sex>男</sex>
	 * </person> </persons>
	 * 
	 * @param ins
	 *            xml文件输入流
	 * @param encoding
	 *            字符编码
	 * @return 返回值:xml文件中的数据集合
	 * @throws Exception
	 */
	public static List<Person> getPersonList(InputStream ins, String encoding)
			throws Exception {
		List<Person> persons = null;
		Person person = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(ins, encoding);
		// 触发一个事件
		int event = parser.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if ("person".equals(parser.getName())) {
					person = new Person();
					person.setId(new Integer(parser.getAttributeValue(0)));
				}
				if (person != null) {
					if ("name".equals(parser.getName())) {
						person.setName(parser.nextText());
					}
					if ("age".equals(parser.getName())) {
						person.setAge(new Integer(parser.nextText()));
					}
					if ("sex".equals(parser.getName())) {
						person.setSex(parser.nextText());
					}
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(parser.getName())) {
					persons.add(person);
					person = null;
				}
				break;
			}
			event = parser.next();
		}

		return persons;
	}

	/**
	 * 功能描述: 通过Pull保存数据到XML文件中
	 * 
	 * @param persons
	 *            用户信息集合
	 * @param outs
	 *            输出流
	 * @param encoding
	 *            字符编码
	 * @throws Exception
	 */
	public static void saveToXml(List<Person> persons, OutputStream outs,
			String encoding) throws Exception {
		XmlSerializer xmlSer = Xml.newSerializer();
		xmlSer.setOutput(outs, encoding);
		xmlSer.startDocument(encoding, true);
		xmlSer.startTag(null, "persons");
		for (Person p : persons) {
			xmlSer.startTag(null, "person");
			xmlSer.attribute(null, "id", String.valueOf(p.getId()));
			xmlSer.startTag(null, "name");
			xmlSer.text(p.getName());
			xmlSer.endTag(null, "name");
			xmlSer.startTag(null, "age");
			xmlSer.text(String.valueOf(p.getAge()));
			xmlSer.endTag(null, "age");
			xmlSer.startTag(null, "sex");
			xmlSer.text(p.getSex());
			xmlSer.endTag(null, "sex");

			xmlSer.endTag(null, "person");
		}
		xmlSer.endTag(null, "persons");
		xmlSer.endDocument();
		outs.flush();
		outs.close();
	}

}



package com.myclover.xml.service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.myclover.xml.bean.Person;

/**
 * 使用Dom技术解析XML文件
 * 
 * @author myclover
 * 
 */
public class DomParseXml {

	/**
	 * 功能描述: 通过dom技术解析XML文件 xml文件格式如下: <?xml version="1.0" encoding="utf-8"?>
	 * <persons> <person id="1001"> <name>张三</name> <age>22</age> <sex>男</sex>
	 * </person> </persons>
	 * 
	 * @param ins
	 *            xml文件输入流
	 * @return 返回值:xml文件中数据集合
	 * @throws Exception
	 */
	public static List<Person> getPersonList(InputStream ins) throws Exception {
		List<Person> persons = new ArrayList<Person>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.parse(ins);
		Element root = doc.getDocumentElement();
		NodeList personNode = root.getElementsByTagName("person");
		for (int i = 0; i < personNode.getLength(); i++) {
			Element personEle = (Element) personNode.item(i);
			int id = new Integer(personEle.getAttribute("id"));
			Person person = new Person();
			person.setId(id);
			NodeList childNode = personEle.getChildNodes();
			for (int j = 0; j < childNode.getLength(); j++) {
				if (childNode.item(j).getNodeType() == Node.ELEMENT_NODE) {
					if ("name".equals(childNode.item(j).getNodeName())) {
						person.setName(childNode.item(j).getFirstChild()
								.getNodeValue());
					} else if ("age".equals(childNode.item(j).getNodeName())) {
						person.setAge(new Integer(childNode.item(j)
								.getFirstChild().getNodeValue()));
					} else if ("sex".equals(childNode.item(j).getNodeName())) {
						person.setSex(childNode.item(j).getFirstChild()
								.getNodeValue());
					}
				}
			}
			persons.add(person);
		}

		ins.close();

		return persons;
	}
}

分享到:
评论

相关推荐

    Android 中利用SAX ,Dom,pull解析 XML 文件代码

    Android 中利用SAX ,Dom,pull解析 XML 文件代码 每种方式都介绍了代码,具体的文档在个人博客: http://blog.csdn.net/blueskydyliu/article/details/7055311 中介绍了。

    Android SAX、DOM、Pull解析xml文件案例讲解

    总结来说,SAX适用于处理大文件,DOM适合对XML结构进行复杂操作,而Pull解析器则在Android中提供了轻量级的解决方案。选择合适的解析方式取决于XML文件的大小、结构以及应用的需求。在实际开发中,开发者应根据具体...

    Android ,SAX,DOM,PULL解析XML

    例如,可以创建一个XML文件(如21.XML),然后分别用SAX、DOM和PULL解析器进行解析,对比它们的实现方式和性能差异。在学习过程中,要注意处理XML的命名空间、属性、实体引用等问题,以及错误处理和异常捕获。 为了...

    android之利用SAX、DOM和Pull实现对schools.xml的解析

    在Android中,可以使用`DocumentBuilderFactory`和`DocumentBuilder`来创建和操作DOM树。通过`getElementsByTagName`、`getAttribute`等方法,可以方便地查找和操作XML元素。 然后是Pull解析器,它是Android特有的...

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

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

    SAX,PULL,DOM解析XML

    XML(eXtensible Markup ...总的来说,SAX和PULL解析适用于处理大型XML文件,节省内存,而DOM解析则提供了一种更直观的方式处理XML,但需要更多内存。根据具体的应用场景和需求,开发者可以选择合适的XML解析方法。

    Android XML解析 SAX DOM Pull

    在Android中,有三种主要的XML解析方式:SAX(Simple API for XML)、DOM(Document Object Model)和Pull Parser。下面将详细介绍这三种解析方式,并结合person类的实例进行讲解。 1. SAX解析: SAX是一种事件驱动...

    使用sax,pull,dom4j解析XML

    在Java中,有三种主要的解析XML的方式:SAX(Simple API for XML)、Pull解析器和DOM4J。下面将详细介绍这三种方法以及它们在Eclipse 4.8和Java 1.8环境下的使用。 1. **SAX解析器** SAX是一种基于事件驱动的解析...

    android 三种方式解析XML(DOM,Pull,Sax) 带文件编码识别

    本篇文章将深入探讨三种在Android中解析XML的方法:DOM(文档对象模型)、Pull(拉取解析器)和SAX(简单API for XML),并且会特别强调如何识别文件编码。 首先,DOM解析是将整个XML文件加载到内存中形成一个树形...

    android xml 的解析 sax dom pull 解析

    在Android开发中,有三种主要的XML解析技术:SAX(Simple API for XML)、DOM(Document Object Model)和PULL(Pull Parser)。下面将详细介绍这三种解析方式及其在Android中的应用。 1. SAX解析: SAX(Simple ...

    Android sax pull dom 文件解析 示例

    下面将详细介绍这三种方法,并结合提供的"PullXmlDemo"文件,对Android中的XML解析进行深入探讨。 1. **SAX解析** SAX是一种基于事件驱动的解析器,它读取XML文件时会触发一系列事件,如开始元素、结束元素等。...

    android使用pull 解析xml文件源码

    pull解析xml文件,和sax和dom一样 都可以脱离android单独使用,pull和sax的原理一样,不一样的地方是pull读取xml文件后调用方法返回的是数字, 读取到xml的声明返回数字0 START_DOCUMENT; 读取到xml的结束返回数字1 ...

    Android中XML的解析Pull//SAX/DOM

    如果XML文件较小,且需要对整个文档进行复杂操作,DOM解析器可能是更好的选择。在Android中,由于内存限制,通常推荐使用Pull解析器,因为它提供了更高效的内存管理和更简洁的编程模型。同时,Android SDK还提供了...

    android, pull,sax,dom 解析

    本篇文章将深入探讨Android中的三种主要XML解析方式:SAX(Simple API for XML)、DOM(Document Object Model)和Pull解析。 1. **SAX解析**: SAX解析是一种事件驱动的解析方式,它不会一次性加载整个XML文档到...

    SAX,DOM,PULL解析示例

    无论是哪种解析方式,读取XML文件的基本步骤都包括打开文件、创建解析器对象、设置事件处理器(对于SAX和PULL),然后启动解析。在解析过程中,根据解析器的不同,处理相应的事件。 5. 写入XML文件: 写入XML文件...

    android解析XML总结(SAX、Pull、Dom三种方式)

    本文将深入探讨三种在Android中解析XML的主要方法:SAX(Simple API for XML)、Pull解析器和DOM(Document Object Model),并结合代码实现进行详细阐述。 **1. SAX解析** SAX(Simple API for XML)是一种事件...

    android上使用DOM解析XML

    下面将详细介绍在Android中使用DOM解析XML的基本步骤和关键知识点。 1. **导入XML解析库** 在Android项目中,我们不需要额外导入库,因为DOM解析器是Java标准库的一部分,已经包含在Android SDK中。这意味着你可以...

    android中使用PULL解析XML

    本文将深入探讨如何在Android中使用PULL解析器(Pull Parser)来解析XML文档,这是一种轻量级且高效的解析方式。 **PULL解析器概述** PULL解析器(Pull Parsing)是一种事件驱动的解析模型,它不需要完整的XML文档...

    通过SAX和PULL来解析XML,同时生成xml

    在Android中,可以使用`XmlPullParser`接口来实现PULL解析。使用PULL解析XML的步骤如下: 1. 获取`XmlPullParser`实例,例如使用`XmlPullParserFactory`的`newInstance`方法。 2. 设置输入源,可以是文件、流或其他...

Global site tag (gtag.js) - Google Analytics