XML解析的三种方式

参考:http://blog.csdn.net/liuhe688/article/details/6415593

首先定义一个接口

package com.lei.xml;

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

public interface XMLParser {
	// 解析xml
	<T> List<T> xmlParse(InputStream is);

	//构造xml
	<T> String xmlSerializer(List<T> list);
}

1. PULL解析

解析速度快,事件处理,不会预加载整个文档

package com.lei.xml;

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

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

import android.util.Xml;

public class PullParse implements XMLParser {

	public static PullParse getInstance() {
		return new PullParse();
	}

	public <T> List<T> xmlParse(InputStream is) {
		List<Book> list = null;
		Book book = null;
		XmlPullParser parser = Xml.newPullParser();
		// XmlPullParser parser =
		// XmlPullParserFactory.newInstance().newPullParser();
		try {
			parser.setInput(is, "utf-8");

			int type = parser.getEventType();
			while (type != XmlPullParser.END_DOCUMENT) {//整个xml结束标签,出口

				switch (type) {
				case XmlPullParser.START_DOCUMENT://整个xml开始标签,入口
					list = new ArrayList<Book>();
					break;

				case XmlPullParser.START_TAG://子开始标签
					if (parser.getName().equals("book")) {
						book = new Book();
					} else if (parser.getName().equals("id")) {
						type = parser.next();
						book.setId(Integer.parseInt(parser.getText()));

					} else if (parser.getName().equals("name")) {
						type = parser.next();
						book.setName(parser.getText());
					}
					break;
				case XmlPullParser.END_TAG://子结束标签
					if (parser.getName().equals("book")) {
						list.add(book);
					}
					break;
				}
				type = parser.next();
			}

		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return (List<T>) list;
	}

	public <T> String xmlSerializer(List<T> list) {
		List<Book> lists = (List<Book>) list;
		XmlSerializer serializer = Xml.newSerializer();
		try {
			serializer.startDocument("utf-8", true);
			serializer.setOutput(new StringWriter());
			serializer.startTag("", "books");

			for (Book book : lists) {
				serializer.startTag("", "book");

				serializer.attribute("", "id", String.valueOf(book.getId()));

				serializer.startTag("", "name");
				serializer.text(book.getName());
				serializer.endTag("", "name");

				serializer.endTag("", "book");
			}

			serializer.endTag("", "books");
			serializer.endDocument();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return serializer.toString();
	}

}

2. SAX解析

树形结构,速度款,占用内存少,会预加载整个文档,适用于文档较小。

package com.lei.xml;

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

import javax.xml.parsers.ParserConfigurationException;
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.lei.utils.Logs;

public class SaxParse implements XMLParser {

	public static SaxParse getInstance() {
		return new SaxParse();
	}

	/**
	 * 解析xml
	 */
	public <T> List<T> xmlParse(InputStream is) {
		try {
			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
			MyXmlHandler handler = new MyXmlHandler();
			parser.parse(is, handler);

			return (List<T>) handler.getBookList();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 生成xml
	 */
	public <T> String xmlSerializer(List<T> list) {
		return null;
	}

	class MyXmlHandler extends DefaultHandler {
		List<Book> list;
		Book book;
		StringBuilder builder;

		public List<Book> getBookList() {

			return list;
		}

		// 入口,开始
		@Override
		public void startDocument() throws SAXException {
			super.startDocument();
			Logs.v("startDocument");
			list = new ArrayList<Book>();
			builder = new StringBuilder();
		}

		// 出口,结束
		@Override
		public void endDocument() throws SAXException {
			super.endDocument();
			Logs.v("endDocument");

		}

		// 开始解析开始标签
		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			super.startElement(uri, localName, qName, attributes);
			Logs.v("startElement  " + "uri " + uri + " localName " + localName
					+ " qName  " + qName);
			if ("book".equals(localName)) {
				book = new Book();
			}
			builder.setLength(0);// 每次豆浆builder清空

		}

		// 结束标签
		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			super.endElement(uri, localName, qName);
			Logs.v("endElement  " + "uri " + uri + " localName " + localName
					+ " qName  " + qName);
			if ("id".equals(localName)) {
				book.setId(Integer.parseInt(builder.toString()));
			} else if ("name".equals(localName)) {
				book.setName(builder.toString());
			} else if ("book".equals(localName)) {
				list.add(book);
			}

		}

		// 获取子标签的内容
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			super.characters(ch, start, length);
			builder.append(ch, start, length);
			Logs.v("characters " + new String(ch, start, length));
		}

	}

}

3.DOM解析

预先加载整个文档,占用内存大,不推荐使用

package com.lei.xml;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomParse implements XMLParser {

	public static DomParse getInstance(){
		return new DomParse();
	}

	public <T> List<T> xmlParse(InputStream is) {
		List<Book> list = new ArrayList<Book>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(is);
			Element element = doc.getElementById("book");
			NodeList nodeList = element.getChildNodes();
			Book book = null;
			for (int i = 0; i < nodeList.getLength(); i++) {
				Node node = nodeList.item(i);
				book = new Book();

				NodeList details = node.getChildNodes();
				for (int j = 0; j < details.getLength(); j++) {
					if (node.getLocalName().equals("id")) {
						book.setId(Integer.parseInt(node.getNodeValue()));
					} else if (node.getLocalName().equals("name")) {
						book.setName(node.getNodeValue());
					}
				}
				list.add(book);
			}

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return (List<T>) list;
	}

	public <T> String xmlSerializer(List<T> list) {
		return null;
	}

}

使用:

在 assets下放了一个books.xml

private void parseXmBySax() {
		try {
			InputStream is = getAssets().open("books.xml");
			List<Book> list = new SaxParse().xmlParse(is);
			for (Book book : list) {
				mShowTv.append(book.toString());
			}

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

	private void parseXmByPull() {
		InputStream is = null;
		try {
			is = getAssets().open("books.xml");
		} catch (IOException e) {
			e.printStackTrace();
		}
		List<Book> list = PullParse.getInstance().xmlParse(is);
		for (Book book : list) {
			mShowTv.append(book.toString());
		}
	}

	private void parseXmlByDom() {
		InputStream is = null;
		try {
			is = getAssets().open("books.xml");
		} catch (IOException e) {
			e.printStackTrace();
		}
		List<Book> list = new SaxParse().xmlParse(is);
		for (Book book : list) {
			mShowTv.append(book.toString());
		}
	}

时间: 2024-10-27 11:53:22

XML解析的三种方式的相关文章

XML解析的三种方式(dom,sax,dom4j)

1.Dom解析: 要解析的xml文件内容: <?xml version="1.0" encoding="utf-8" standalone="no"?><class> <stu id="1"> <name>小灰灰</name> <age>23</age> <insto>好学生</insto> </stu> &

解析Xml文件的三种方式及其特点

解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. 1 class MyDefaultHander extends DefaultHandler{ 2 private List<Student> list; 3 private Student student; 4 5 @Override 6 public void startDo

爬虫之数据解析的三种方式

一,正则表达式解析 re正则就不写了,前面已经写入一篇很详细的正则表达式模块了~ 而且,在爬虫中,下面两种方式用的多一些~ 正则表达式:https://www.cnblogs.com/peng104/p/9619801.html 大致用法: pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a' +'.*?>(.*?)<

爬虫数据解析的三种方式

一.正则表达式解析 常用正则表达式回顾: 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\w \s :所有的空白字符包,括空格.制表符.换页符等等.等价于 [ \f\n\r\t\v]. \S : 非空白 数量修饰: * : 任意多次 >=0 + : 至少1次 >=1 ? : 可有可无 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次

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

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id="0&q

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

一.SAX.DOM.PULL的比较 SAX.DOM.PULL各有自己的特点,具体操作XML的时候该如何选择呢? 1.内存占用 这是一个根本性问题.由于Android手机性能相对于现在的应用操作还是有限的,程序对内存的占用直接影响到了解析XML的速度.在这点上,SAX.Pull以它们比DOM占用更少的内存的解析方式,更适合于Android手机开发. 2.编程方式 SAX采用事件驱动,在相应事件触发的时候,会调用用户编写好的方法.也就是说,每解析一类XML,就要编写一个新的适合该类XML的处理类.这

javascript创建函数的三种方式

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content=

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM.SAX以及XMLpull,这里对它们进行总结. 如果理解有误,欢迎指正   ^_* 一.DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据.这个写起来很简单,但是很消耗内存.要是数据过大,手机不够牛逼,可能手机直接死机. 常用的DoM接口和类: Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.Element:该接口继承Node接口,提供了获

Android学习之XML数据的三种解析方式以及生成XML文件

首先,我得声明,本博客的思想主要参考了此博客:http://blog.csdn.net/liuhe688/article/details/6415593 不过代码我自己一句句敲的 好了,首先讲一下解析XML的三种方式:(恕我粘贴一下哈) SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理.在事件源调用事件处理器中特定方