Android下使用pull解析器生成XML文件、读取XML文件

Android下使用Pull解析器
	1,Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件。
	2,使用parser.next()可以进入下一个元素并触发相应事件。
	3,事件将作为一个int数值被发送,因此可以使用一个switch对相应的事件进行处理。
	4,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
	5,相关API:
		获得当前节点事件类型:parser.getEventType();
		获得下一节点事件类型:parser.next();
		获得标签属性值:	  parser.getAttributeValue();
		获得标签后面文本内容:parser.nextText();
	
	例子:
		<?xml version="1.0" encoding="UTF-8"?>
		<persons>
			<person id=“18">
				<name>allen</name>
				<age>36</age>
			</person>
			<person id=“28">
				<name>james</name>
				<age>25</age>
			</person>
		</persons>
	
	// 使用Pull解析器生成XML文件,并写到本地
	private void writeXmlToLocal() {
		List<Person> personList = getPersonList();
		
		// 获得序列化对象
		XmlSerializer serializer = Xml.newSerializer();
//		XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
		
		try {
			File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
			FileOutputStream fos = new FileOutputStream(path);
			
			// 指定序列化对象输出的位置和编码
			serializer.setOutput(fos, "utf-8");
			
						// 写开始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
			serializer.startDocument("utf-8", true);		
			
			serializer.startTag(null, "persons");			// <persons>
			
			for (Person person : personList) {
			
				// 开始写person
				serializer.startTag(null, "person");		// <person>
				serializer.attribute(null, "id", String.valueOf(person.getId()));
				
				// 写person的name
				serializer.startTag(null, "name");			// <name>
				serializer.text(person.getName());
				serializer.endTag(null, "name");			// </name>
				
				// 写person的age
				serializer.startTag(null, "age");			// <age>
				serializer.text(String.valueOf(person.getAge()));
				serializer.endTag(null, "age");				// </age>
				
				serializer.endTag(null, "person");			// </person>
			}
			
			serializer.endTag(null, "persons");				// </persons>
			
			serializer.endDocument();						// 结束
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	// 使用Pull解析器读取本地的XML文件
	private List<Person> parserXmlFromLocal() {
		try {
			File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
			FileInputStream fis = new FileInputStream(path);
			
			// 获得pull解析器对象
			XmlPullParser parser = Xml.newPullParser();
//			XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); 
			
			// 指定解析的文件和编码格式
			parser.setInput(fis, "utf-8");
			
			// 获得事件类型
			int eventType = parser.getEventType();
			
			List<Person> personList = null;
			Person person = null;
			String id;
			while(eventType != XmlPullParser.END_DOCUMENT) {
			
				// 获得当前节点的名称
				String tagName = parser.getName();
				
				switch (eventType) {
				case XmlPullParser.START_TAG: 				// 当前等于开始节点  <person>
					if("persons".equals(tagName)) {			// <persons>
						personList = new ArrayList<Person>();
					} else if("person".equals(tagName)) { 	// <person id="1">
						person = new Person();
						id = parser.getAttributeValue(null, "id");
						person.setId(Integer.valueOf(id));
					} else if("name".equals(tagName)) { 	// <name>
						person.setName(parser.nextText());
					} else if("age".equals(tagName)) { 		// <age>
						person.setAge(Integer.parseInt(parser.nextText()));
					}
					break;
				case XmlPullParser.END_TAG:		// </persons>
					if("person".equals(tagName)) {
						// 需要把上面设置好值的person对象添加到集合中
						personList.add(person);
					}
					break;
				default:
					break;
				}
				// 获得下一个事件类型
				eventType = parser.next();		
			}
			return personList;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
	
	
	

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。