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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本文来自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!


目录
打赏
0
0
0
0
2
分享
相关文章
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
JSON数据解析实战:从嵌套结构到结构化表格
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
48 15
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
11 1
Bilibili直播信息流:连接方法与数据解析
本文详细介绍了自行实现B站直播WebSocket连接的完整流程。解析了基于WebSocket的应用层协议结构,涵盖认证包构建、心跳机制维护及数据包解析步骤,为开发者定制直播数据监控提供了完整技术方案。
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
如何高效爬取天猫商品数据?官方API与非官方接口全解析
本文介绍两种天猫商品数据爬取方案:官方API和非官方接口。官方API合法合规,适合企业长期使用,需申请企业资质;非官方接口适合快速验证需求,但需应对反爬机制。详细内容涵盖开发步骤、Python实现示例、反爬策略、数据解析与存储、注意事项及扩展应用场景。推荐工具链包括Playwright、aiohttp、lxml等。如需进一步帮助,请联系作者。
淘宝商品评论API接口系列的应用与数据解析
在电商平台中,用户评论是了解商品质量、服务水平和用户满意度的重要数据来源。淘宝作为中国最大的电商平台,提供了商品评论API接口,帮助开发者获取和分析用户评价数据。本文将介绍淘宝商品评论API接口系列的作用、使用方法,并通过示例展示如何调用API并解析返回的JSON数据。
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
56 29

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等