Android中XML解析-PULL解析

前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似,也是事件触发的。Pull解析方式让应用程序完全控制文档该怎么样被解析,比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理,只过PULL方式读xml回调方法返回的是数字。

Pull创建XML

创建XML先实例化一个序列化对象,之后的通过Tag进行操作:

public void createXML() {
		// 初始化一个序列化对象
		XmlSerializer serializer = Xml.newSerializer();
		File path = new File(getFilesDir(), "BookTest.xml");
		try {
			FileOutputStream foStream = new FileOutputStream(path);
			serializer.setOutput(foStream, "utf-8");
			//设置文档<?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘?>
			serializer.startDocument("utf-8", true);
			//设置根节点
			serializer.startTag(null, "Books");
			for (int i = 1; i < 4; i++) {
				//设置子节点
				serializer.startTag(null, "Book");
				serializer.attribute(null, "name", "书籍" + i);
				serializer.startTag(null, "Title");
				serializer.text("内容" + i);
				serializer.endTag(null, "Title");
				serializer.endTag(null, "Book");
			}
			serializer.endTag(null, "Books");
			serializer.endDocument();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

 生成的XML的结果:

<?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘?>
<Books>

    <Book name="书籍1" >

        <Title>
内容1
        </Title>
    </Book>

    <Book name="书籍2" >
        <Title>
内容2
        </Title>
    </Book>

    <Book name="书籍3" >

        <Title>
内容3
        </Title>
    </Book>

</Books>

Pull读取XML

首先看一张效果图:

展示内容调用getListBooksByPull方法:

	public List<Book> getListBooksByPull() {
		list = new ArrayList<Book>();
		File path = new File(getFilesDir(), "BookTest.xml");
		try {
			FileInputStream inputStream = new FileInputStream(path);
			// 获得pull解析器对象
			XmlPullParser parser = Xml.newPullParser();
			// 指定解析的文件和编码格式
			parser.setInput(inputStream, "utf-8");
			int eventType = parser.getEventType(); // 获得事件类型
			Book book = null;
			while (eventType != XmlPullParser.END_DOCUMENT) {
				String tagNameString = parser.getName();
				switch (eventType) {
				case XmlPullParser.START_TAG:
					if ("Book".equals(tagNameString)) {//Book标签
						book = new Book();
						book.setName(parser.getAttributeValue(null, "name"));
					} else if ("Title".equals(tagNameString)) {//Title标签
						book.setTitle(parser.nextText());
					}
					break;
				case XmlPullParser.END_TAG:
					if ("Book".equals(tagNameString)) {
						list.add(book);
					}
					break;
				default:
					break;
				}
				eventType = parser.next();//重新赋值,不然会死循环
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

 相对于Dom和SAX来说,Pull比较简单易读,不过简单的总结一下常用的几个方法:读取到xml的声明返回      START_DOCUMENT; 读取到xml的结束返回       END_DOCUMENT ; 读取到xml的开始标签返回 START_TAG ,读取到xml的结束标签返回 END_TAG 读取到xml的文本返回       TEXT .

Activity加载时候调用:

	ListView listView = (ListView) findViewById(R.id.list_pull);
		ArrayList<HashMap<String, String>> arrayList = new ArrayList<HashMap<String, String>>();
		list = getListBooksByPull();
		for (Book book : list) {
			HashMap<String, String> map = new HashMap<String, String>();
			map.put("itemTitle", book.getName());
			map.put("itemText", book.getTitle());
			arrayList.add(map);
		}
		SimpleAdapter simpleAdapter = new SimpleAdapter(this, arrayList,
				R.layout.book, new String[] { "itemTitle", "itemText" },
				new int[] { R.id.itemTitle, R.id.itemText });
		listView.setAdapter(simpleAdapter);

  简单回顾一下三种解析方式,Dom解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机配置不行可能会死机。SAX解析是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。Pull解析器和SAX解析器很相似,但SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。Pull的写法确实很轻巧也很容易上手,个人比较喜欢Pull。

时间: 2024-08-06 03:44:42

Android中XML解析-PULL解析的相关文章

android中xml的pull解析

xml的pull解析:    //类加载器加载xml文件 InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("weather.xml"); //生成xml的pull解析器 XmlPullParser pull = Xml.newPullParser(); try { //设置输入流 pull.setInput(is, "utf-8"); //解析器当前处于的状态 int

Android中XML数据解析

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML(Extensible Markup Language的缩写,意为可扩展的标记语言),它是一种元标记语言,即定义了用于定义其他特定领域有关语义的.结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识.XML 文档定义方式有:文档类型定义(DTD)和XML Schema.DTD定义了文

Android开发之使用PULL解析和生成XML

请尊重他人的劳动成果,转载请注明出处:Android开发之使用PULL解析和生成XML 一.使用PULL解析XML 1.PULL简介 我曾在<浅谈XMl解析的几种方式>一文中介绍了使用DOM方式,SAX方式,Jdom方式,以及dom4j的方式来解析XML.除了可以使用以上方式来解析XML文件外,也可以使用Android系统内置的Pull解析器来解析XML文件. Pull解析器的运行方式与SAX解析器相似.它提供了类似的事件,如开始元素和结束元素事件.使用parser.next()可以进入下一个

Android中XML解析

package com.example.thebroadproject; public class Book { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setN

android网络编程之pull解析xml

android网络编程之pull解析xml 除了前面介绍过的SAX以及DOM方法,还可以通过Pull对xml文档进行一个解析.Pull解析器的解析方式与SAX非常相似.它提供了类似的事件,使用parser.next()可以进入下一元素并触发相应事件,事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行选择,然后进行相应的处理,调用parser.nextText()方法可以获取下一个Text类型元素的值. pull解析器特点: *结构简单:一个接口.一个例外.一个工厂就组成了P

XML之pull解析

PULL是STAX的一个实现技术STAX是The Streaming API for XML的缩写,是一种利用拉模式解析XML文档的APISTAX通过提供一种基于世界迭代器的API让程序员控制xml文档的解析过程A安卓系统内置的PULL解析器也可以进行XML文件的解析Pull解析器是一个java的开源项目,既可以用于安卓,也可以用于javaEEpull解析器运行方式与SAX解析器相似,同样是基于事件驱动的,是由客户端的程序自己控制xml事件主动调用事件方法当要使用pull解析的方式开发javaE

Day01—xml的序列化、xml的pull解析

1.xml的序列化 FileOutputStream os = new FileOutputStream(new File(getFilesDir(),"hai.xml")); //1.获取xml序列化器 XmlSerializer xmlSerializer = Xml.newSerializer(); //2.开始序列化输出流 xmlSerializer.setOutput(os,"utf-8");//os---Outputm,xml文件的写出流,文件的编码格式

网络获取数据的Xml的Pull解析

网络获取的XML的Pull解析 <?xml version="1.0" encoding="utf-8" ?> - <students> - <student xuehao="1233">  <name>张三</name>   <address>北京市昌平区</address> - <call>  <phone>010-37464567&l

android 中Xml里面的id重名问题

情况一:同个一个Xml文件中的同名 在同个一个Xml文件的中若同名了,则前一个有效,而后一个无效 情况二:在不同的Xml 文件中的同名 在不同Xml文件的Id若同名了,两者都有效的. 当android的工程越来越大.xml文件越来越多时,避免不了两个xml文件中同 样的组件使用同样的id名字,gen目录下的R.java文件中,有关id的声明都在id的class中,即public static final class id{}:当两个xml文件中同样的组件,比如Button,有可能很多个文件中,都