Android中级之网络数据解析一之xml解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!--Comic Sans MSXml解析具有跨平台性,语言无关性,易操作性,因此广受开发者的欢迎。


本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

--Comic Sans MS



Xml解析具有跨平台性,语言无关性,易操作性,因此广受开发者的欢迎。作为安卓开发者,至少有三种解析方式需要理解,Dom、Sax、Pull。

另外Java的四种解析XML的方法:http://developer.51cto.com/art/200903/117512.htm

1、首先讲一下dom解析

解析原理:将xml装入Dom树,依次根据Tag查到每个节点,然后取得结点里的对象属性。

以本地xml解析为例:

book.xml放到项目lib目录下

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book>
</books>

操作逻辑:

public static void main(String[] args) throws Exception {
		InputStream input = new FileInputStream("lib/book.xml");
		List<Book> books = getBooks(input);
		for (Book book : books) {
			System.out.println(book.toString());
		}
	}

	public static List<Book> getBooks(InputStream inputStream) throws Exception {
		List<Book> list = new ArrayList<Book>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//new一个factory来处理文件
		DocumentBuilder builder = factory.newDocumentBuilder();//做一个处理框架
		Document document = builder.parse(inputStream);// 把文件形成流的形式,放到一个doucument对象里
		Element element = document.getDocumentElement();// 获得其中的元素集
		NodeList bookNodes = element.getElementsByTagName("book");// 获得元素集下有一叫book的集合
		for (int i = 0; i < bookNodes.getLength(); i++) {
			Element bookElement = (Element) bookNodes.item(i);// 获取一个元素,然后设值
			Book book = new Book();
			book.setId(Integer.valueOf(bookElement.getAttribute("id")));
			NodeList childNodes = bookElement.getChildNodes();

			for (int j = 0; j < childNodes.getLength(); j++) {
				if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {// 结点
					String type=childNodes.item(j).getNodeName();
					String value = childNodes.item(j).getFirstChild()
							.getNodeValue();
					if ("name".equals(type)) {
						book.setName(value);
					} else if ("price".equals(type)) {
						book.setPrice(Float.valueOf(value));
					}
				}
			}// end for j
			list.add(book);
		}// end for i
		return list;
	}

2、

其次sax解析也相当常用

解析原理:将xml装入Sax解析工厂中,根据既定的模式可选择解析,使用的是标记事件驱动方式。

BookXmlHandler:

public class BookXMLHandler extends DefaultHandler {

	private List<Book> books;
	private Book book;
	private String tag;

	public List<Book> getBooks() {
		// TODO Auto-generated method stub
		return books;
	}

	/*
	 * 文档开始时触发
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		books = new ArrayList<Book>();
	}

	/*
	 * 元素开始时触发
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		tag = qName;
		if ("book".equals(tag)) {
			book = new Book();
			book.setId(Integer.valueOf(attributes.getValue(0)));
		}
	}

	/*
	 * 读取元素内容
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		if (tag == null) {
			return;
		}
		String content = new String(ch, start, length);
		if (content.trim().equalsIgnoreCase(null)
				|| content.trim().equalsIgnoreCase("")) {
			return;
		}// 一定要记得trim
		if ("name".equals(tag)) {
			book.setName(content);
		} else if ("price".equals(tag)) {
			System.out.println(content);
			book.setPrice(Float.valueOf(content));
		}
	}

	/*
	 * 元素结束时触发
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
		if ("book".equals(qName)) {
			books.add(book);
			book = null;
			tag = null;
		}
	}

	/*
	 * 文档结束时触发
	 */
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
	}
}

操作逻辑:

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		InputStream input = new FileInputStream("lib/book.xml");
		List<Book> books = getBooks(input);
		for (Book book : books) {
			System.out.println(book.toString());
		}
	}

	private static List<Book> getBooks(InputStream input) throws Exception {
		// TODO Auto-generated method stub
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		SAXParser saxParser = saxParserFactory.newSAXParser();
		BookXMLHandler handler = new BookXMLHandler();
		saxParser.parse(input, handler);
		return handler.getBooks();
	}

3、

第三种pull解析在安卓中是个特例

解析原理:它比Sax封装又高一个等级,是Sax的浓缩版,测试需要在Android环境下测。

测试逻辑:

public class PullParseTest extends AndroidTestCase {
	public void testPull() throws Exception {
		InputStream input = getContext().getAssets().open("book.xml");
		List<Book> books = getBooks(input);
		for (Book book : books) {
			Log.i("AthrunTag", book.toString());
		}
	}

	public List<Book> getBooks(InputStream inputStream) throws Exception {
		List<Book> books = null;
		Book book = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inputStream, "UTF-8");
		int event = parser.getEventType();// 产生第一个事件
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:// 判断当前事件是否是文档开始事件
				books = new ArrayList<Book>();// 初始化books集合
				break;
			case XmlPullParser.START_TAG:// 判断当前事件是否是标签元素开始事件
				if ("book".equals(parser.getName())) {// 判断开始标签元素是否是book
					book = new Book();
					book.setId(Integer.parseInt(parser.getAttributeValue(0)));// 得到book标签的属性值,并设置book的id
				}
				if (book != null) {
					if ("name".equals(parser.getName())) {// 判断开始标签元素是否是name
						book.setName(parser.nextText());
					} else if ("price".equals(parser.getName())) {// 判断开始标签元素是否是price
						book.setPrice(Float.parseFloat(parser.nextText()));
					}
				}
				break;
			case XmlPullParser.END_TAG:// 判断当前事件是否是标签元素结束事件
				if ("book".equals(parser.getName())) {// 判断结束标签元素是否是book
					books.add(book);// 将book添加到books集合
					book = null;
				}
				break;
			}
			event = parser.next();// 进入下一个元素并触发相应事件
		}// end while
		return books;
	}
}

三种解析“真相”只有一个!

12:thinking in java:85.5
15:Spring in Action:39.0

3Q!


目录
相关文章
|
4天前
|
SQL 安全 算法
网络安全与信息安全的全面解析:应对漏洞、加密技术及提升安全意识的策略
本文深入探讨了网络安全和信息安全的重要性,详细分析了常见的网络安全漏洞以及其利用方式,介绍了当前流行的加密技术及其应用,并强调了培养良好安全意识的必要性。通过综合运用这些策略,可以有效提升个人和企业的网络安全防护水平。
|
6天前
|
存储 SQL 安全
网络安全与信息安全的全方位解析
本文深入探讨了网络安全和信息安全领域的关键要素,包括网络漏洞、加密技术及安全意识。通过分析这些核心内容,旨在为读者提供实用的知识,以增强个人和企业的信息安全防护能力。我们将从技术角度和管理措施两个维度出发,全面解读如何识别和应对网络威胁,以及如何构建一个安全的网络环境。
|
4天前
|
XML 数据格式 开发者
解析数据的Beautiful Soup 模块(一)
解析数据的Beautiful Soup 模块(一)
25 0
|
2天前
|
域名解析 缓存 网络协议
【网络】DNS,域名解析系统
【网络】DNS,域名解析系统
9 1
|
5天前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
|
8天前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
|
4天前
|
前端开发 Python
解析数据的Beautiful Soup 模块(二)
解析数据的Beautiful Soup 模块(二)
12 1
|
11天前
|
存储 安全 算法
网络安全的盾牌与利剑:漏洞防范与加密技术解析
【9月更文挑战第31天】在数字时代的浪潮中,网络安全成为守护个人隐私和组织资产的重要屏障。本文将深入探讨网络安全中的两大关键要素:安全漏洞和加密技术。我们将从漏洞的类型、检测方法到如何有效修补,逐一剖析;同时,对加密技术的基本原理、应用实例进行详细解读。文章旨在为读者提供一套实用的网络安全知识框架,帮助提升网络防护意识和技能,确保在日益复杂的网络环境中保护好每一份数据。
25 3
|
1天前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
9 0
|
2天前
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:

热门文章

最新文章

推荐镜像

更多