Pull解析

一、XML:【掌握】
1、概念:extensive markup language(可扩展的标记语言)
XML是一种通用的数据存储和交换格式,与平台无关,与编程语言无关,与操作系统无关。给数据集成和交互提供了极大的便利。
将数据格式化成XML文件后,真正实现了数据跨平台的交互和共享。在不同语言中,xml的解析方式都一样。
2、XML的解析:xml parse
对xml文件进行阅读和分析,提取出希望的数据和数据属性。在android开发中,将xml解析后,把数据放进List<Map<String, Object>>集合中是我们的最终目的。
3、XML的解析方式:
  • DOM(document object model  :文档对象模型)【了解】:借助文档树模型对xml文档进行分析
  • SAX(simple API for xml  :xml的简单api)【了解】:利用事件流的形式解析XML
  • PULL【掌握】:利用事件流模型来解析XML
【备注:DOM和SAX解析的优劣分析:DOM是将文档一次性读入到内存,然后以文档树模进行分析节点信息。获取到希望获取的数据;
而SAX是事件流的形式去分析xml文件。DOM可以做到对文档中部分节点的修改、删除和新增,而SAX无法做到。

4、XML文件格式:
1.每个xml文件中要有一个,且只能有一个xml根节点;
2.xml文件的数据中不可以 出现"< "或者" >";

二、DOM解析xml
1、核心类:
  • DocumentBuilderFactory
  • DocumentBuilder
  • Doucment
  • Element
  • NodeList
  • Node

2、核心代码:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   // 使用工厂来实例化一个构造Document的对象
                        DocumentBuilder builder = factory.newDocumentBuilder();
// 利用DocumentBuilder来构造一个Document对象
Document document = builder.parse(filename);
// 获取Document文档的根节点对象
Element root = document.getDocumentElement();
// 通过根节点,获取到根节点下面的所有二级子节点
NodeList nodeList = root.getChildNodes();

// 遍历子节点,获取内部的每一个节点
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
                // 获取每个末端阶段的文本值和节点名称,将其存入到Map对象中
                map.put(item.getNodeName(), item.getTextContent());
list.add(map);
}
}


三、PULL解析xml:
1、核心类:
  • XmlPullParserFactory
  • XmlPullParser
2、核心代码:
// 实例化一个xml pull解析的工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 实例化一个xml pull解析对象
XmlPullParser pullParser = factory.newPullParser();
// 将xml文件作为流传入到inputstream
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("customers.xml"));

// xml解析对象接收输入流对象
pullParser.setInput(bis, "utf-8");

int event = pullParser.getEventType();
List<Map<String, Object>> list = null;
Map<String, Object> map = null;

while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if ("customer".equals(pullParser.getName())) {
map = new HashMap<String, Object>();
}
if (pullParser.getName().equals("name")) {
map.put("name", pullParser.nextText());
}
if (pullParser.getName().equals("tel")) {
map.put("tel", pullParser.nextText());
}
// if (pullParser.getName().equals("email")) {
// map.put("email", pullParser.nextText());
// }
break;
case XmlPullParser.END_TAG:
if (pullParser.getName().equals("customer")) {
list.add(map);
}
break;
}
event = pullParser.next();
}


3、pull解析方式和dom解析的区别:
pull解析中使用了switch case,所以可以获取客户希望获取到的内容,而不用对整个xml文件进行解析。

4、pull parser 的使用:
只有一个关键方法key(),用于检索下一个事件,只有五个事件类型、

四、Dom tree结构中对节点的分类
1、文档节点:<?version="1.0"  charset="utf-8"?>
2、元素节点:<元素节点></。。。>
3、属性节点:<username name=""(属性节点)></usesrname>
4、文本节点:<XXX>文本节点</XXX>
5、注释节点:<!-- 注释内容 -->

五、PULL Parser中的几种event值。
1、START_DOCUMENT.:0
2、END_DOCUMENT:1
3、START_TAG:2
4、END_TAG:3
5、TEXT:4

-------------------------------------------------案例:解析一个Xml文件---------------------------------------------------
<Items>
<Books type="最新上架" pageCount="5">
<Book bid="126980" title="洞房强制爱" artist="林依雷" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/80/69/2012072418025993.jpg" description="洞房之夜,他把她强压在身下,大手探向她衣衫,“女人,从今天开始你要成为我愉悦的工..." groom="8" booktype="穿越" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="115334" title="老师,太给力!" artist="马甲乃浮云" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/34/53/2011061517502012.jpg" description="我:老师,你是不是看上我了。老师:你想得美。我:那你老来招惹我干什么?老师:偶尔..." groom="8" booktype="校园" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="90634" title="倾城妖娆" artist="空寂" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/34/06/2010092811494322.jpg" description="他紧紧搂着她的腰,性感的嘴唇紧贴在她的唇上,用那魅惑众生的眼神看着她:“睿儿的滋..." groom="8" booktype="穿越" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="79136" title="穿越之孤女和亲" artist="云端1漫步" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/36/91/201207259330647.jpg" description="孤女穿越成公主,终于可以像猪一样开始好吃懒做的生活。享受了公主的福利,自然也要承..." groom="8" booktype="穿越" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="106195" title="狼的追求" artist="蒲公英" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/95/61/2011032316471502.jpg" description="她以最后一名的“桂冠”考上了最好的大学,北辰大学——然而她并不知道,大学里已经有..." groom="8" booktype="校园" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="2181552" title="九色元婴" artist="骑着蜗牛去旅行" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/52/15/2012122416412742.jpg" description="烈日冰棺,万载古尸,被诅咒的家族。九色元婴,一部顶尖的修神功法。在修真者被视为废..." groom="8" booktype="异世" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="34057" title="至尊小厮" artist="断章" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/57/40/2012072418033355.jpg" description="一个青楼小厮接连奇遇,先是将千古至宝极阳玉当成馒头吃下肚子,随后又有修真界第一剑..." groom="8" booktype="仙侠" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="25053" title="奇侠杨小邪" artist="李凉" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/53/50/2010042716411728.jpg" description="杨小邪传奇系列是李凉的代表作,该部是其第一部。描述了杨小邪艺成之后,初出江湖,在..." groom="8" booktype="武侠" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="93954" title="非爱勿扰" artist="睡懒觉的喵" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/54/39/2011081114434368.jpg" description="童话版——萧逸在某次相亲会上捡到了只温顺纯良的小白兔,于是抱回家养之宠之,小白兔..." groom="8" booktype="现代" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="79013" title="MVP女友" artist="夏洛琪" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/13/90/2010042510215217.jpg" description="她,单亲家庭长大的问题的千金,一直以为母亲去世了的她,在五岁时偶然得知,误认为母..." groom="7" booktype="校园" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="84679" title="柔情总裁娇纵妻" artist="九墨玑" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/79/46/201007099245910.jpg" description="他为她浴血奋战,为她伤痕累累,他视她为高傲美丽的天使,却忍不住在她熟睡之时品尝她..." groom="8" booktype="现代" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="96872" title="一压定情" artist="唐谣" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/72/68/2010121316360472.jpg" description="那年夏天,凌芮的车子轧过了萧皓的左脚;仓皇而逃,却没有预料再一次相见会以这样的方..." groom="8" booktype="现代" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="77771" title="总裁的契约情人" artist="小夕" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/71/77/2010051917544601.jpg" description="第一次见面,他就误会了她,认为她是一个爱慕虚荣的女人。再次相遇,他是冷酷总裁,而..." groom="8" booktype="现代" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="118724" title="花月皎" artist="风清月皎" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/24/87/2011071314450858.jpg" description="受尽欺凌冷眼的小乞儿,孤儿院长大的孤女,痛恨欺骗及背叛。弱肉强食,弱者要生存就要..." groom="8" booktype="穿越" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="151199" title="乡村小医师" artist="曾家小少" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/99/11/2012060116030991.jpg" description="农妇山泉有点儿甜,都市神马的都是浮云,乡野少年唐逸凭借着神奇的医术混迹于乡村,且..." groom="8" booktype="异能" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="136934" title="鸿蒙心尊" artist="天空光明" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/34/69/2012041310403124.jpg" description="鸿蒙之中有一物,名曰:鸿蒙梦幻心莲。内涵无上心道,能实现无数人的梦想,成就无上尊..." groom="8" booktype="仙侠" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="102521" title="焚天" artist="流浪的蛤蟆" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/21/25/2011081710211017.jpg" description="洞中金蟾生两翼,鼎里龙虎喷云光。一剑驾驭千万里,踏云便要走八荒。" groom="8" booktype="仙侠" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="25140" title="隐侠传奇" artist="戊戟" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/40/51/2010052715081492.jpg" description="公孙不灭和茜茜公主隐藏自己身份,闯入江湖为线索,展开武林中正义与**的斗争。公孙..." groom="8" booktype="武侠" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="127730" title="家有俏夫郎" artist="辰茉love" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/30/77/2011112917171204.jpg" description="他是栖凤国失宠的七王子。她是仗着家里巨大财富而在整个凤凰城为非作歹的女痞子。他有..." groom="8" booktype="穿越" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
<Book bid="44862" title="恶魔公主VS恶魔王子" artist="尐の潴猪" imgurl="http://r3.11222.cn/resource/bookclub/image/cover79/62/48/2010042819172803.jpg" description="她是公主!她也是丑小鸭!她是美丽可爱的公主```她是有仇必报的女生!所以她是恶魔..." groom="8" booktype="校园" copyright="1" sq_cover_isopen="0" sr_cover_isopen="1" cr_cover_isopen="0"/>
</Books>
</Items>

解析过程如下:
package com.pull.android;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
	private String url = "http://192.168.123.1:8080/XmlParser/Pull/index.xml";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		List<Map<String, String>> list = parserBook();
		Log.i("xmlParserOver ---> ", "解析完毕 --->" + list.size());

		ListView listView = (ListView) findViewById(R.id.listViewId);
		listView.setAdapter(new ListViewAdapter(list));
	}

	/**
	 * 解析Book
	 * 
	 * @param list
	 * @param map
	 */
	private ArrayList<Map<String, String>> parserBook() {
		ArrayList<Map<String, String>> list = null;
		Map<String, String> map = null;
		try {
			// 实例化一个xml pull解析的工厂
			XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
			// 实例化一个xml pull解析对象
			XmlPullParser xpp = factory.newPullParser();

			// // 获得Xml文件的输入流
			InputStream in = getAssets().open("index.xml");
			// 将xml文件作为流传入到inputstream
			BufferedInputStream bis = new BufferedInputStream(in);
			// xml解析对象接收输入流对象
			// xpp.setInput(new StringReader("<foo>Hello World!</foo>"));
			xpp.setInput(bis, "utf-8");

			int eventType = xpp.getEventType();

			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				case XmlPullParser.START_DOCUMENT:
					Log.i("xml-Start document", "");
					list = new ArrayList<Map<String, String>>();
					break;
				case XmlPullParser.START_TAG:
					Log.i("xml-Start tag", "Start tag" + xpp.getName());
					Log.d("xml-Start tagAttributeCount", "tagAttributeCount:"
							+ xpp.getAttributeCount());
					map = new HashMap<String, String>();
					// 如果解析到Book标签时
					if (xpp.getName().equals("Book")) {
						for (int i = 0; i < xpp.getAttributeCount(); i++) {
							String attr = xpp.getAttributeValue(i);
							String attrName = xpp.getAttributeName(i);
							Log.d("xmlAttribute", attrName + "====" + attr);
							map.put(attrName, attr);
						}
						Log.e("xmlAttr", "-----------------------------------");
					}
					break;
				case XmlPullParser.END_TAG:
					Log.i("xml-End tag ", "End tag  --->" + xpp.getName());
					if (xpp.getName().equals("Book")) {
						list.add(map);
					}
					break;
				case XmlPullParser.TEXT:
					Log.i("xml-Text ---> ", "Text --->" + xpp.getText());
					break;
				default:
					break;
				}
				eventType = xpp.next();
			}
			System.out.println("End document" + xpp.getAttributeCount());

		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	class ListViewAdapter extends BaseAdapter {
		private List<Map<String, String>> list;
		private Map<String, String> map;
		private LayoutInflater inflater;

		public ListViewAdapter(List<Map<String, String>> list) {
			super();
			this.list = list;
			inflater = LayoutInflater.from(getApplicationContext());
		}

		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view = convertView;
			if (view == null) {
				view = inflater.inflate(R.layout.item, parent, false);
				ViewHolder vh = new ViewHolder();
				vh.title = (TextView) view.findViewById(R.id.title);
				vh.description = (TextView) view.findViewById(R.id.description);
				vh.artist = (TextView) view.findViewById(R.id.artist);
				vh.booktype = (TextView) view.findViewById(R.id.booktype);
				view.setTag(vh);
			}

			ViewHolder vh = (ViewHolder) view.getTag();
			map = list.get(position);
			vh.title.setText(map.get("title"));
			vh.description.setText(map.get("description"));
			vh.artist.setText(map.get("artist"));
			vh.booktype.setText(map.get("booktype"));
			return view;
		}
	}

	class ViewHolder {
		TextView title;
		TextView description;
		TextView artist;
		TextView booktype;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值