Android实例系列---05.三种解析XML的方法

Android中三种解析XML的方法SAX DOM PULL,推荐使用PULL

0.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>李明</name>
		<age>30</age>
	</person>
	<person id="20">
		<name>李向梅</name>
		<age>25</age>
	</person>
</persons>
 

1.SAX

public class SAXPersonService {
	
	public List<Person> getPersons(InputStream inStream) throws Throwable{
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		PersonParser personParser = new PersonParser();
		parser.parse(inStream, personParser);
		inStream.close();
		return personParser.getPersons();
	}

	private final class PersonParser extends DefaultHandler{
		private List<Person> persons = null;
		private String tag = null;
		private Person person = null;

		public List<Person> getPersons() {
			return persons;
		}

		@Override
		public void startDocument() throws SAXException {
			persons = new ArrayList<Person>();
		}
		
		@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
			if("person".equals(localName)){
				person = new Person();
				person.setId(new Integer(attributes.getValue(0)));
			}
			tag = localName;
		}
		
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			if(tag!=null){
				String data = new String(ch, start, length);//获取文本节点的数据
				if("name".equals(tag)){
					person.setName(data);
				}else if("age".equals(tag)){
					person.setAge(new Short(data));
				}
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if("person".equals(localName)){
				persons.add(person);
				person = null;
			}
			tag = null;
		}
	}
}

 2.DOM

public class DOMPersonService {

	public static List<Person> getPersons(InputStream inStream) throws Throwable{
		List<Person> persons = new ArrayList<Person>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document documnet = builder.parse(inStream);
		Element root = documnet.getDocumentElement();
		NodeList personNodes = root.getElementsByTagName("person");
		for(int i=0 ; i < personNodes.getLength(); i++){
			Person person = new Person();
			Element personElement = (Element)personNodes.item(i);
			person.setId(new Integer(personElement.getAttribute("id")));
			NodeList personChilds = personElement.getChildNodes();
			for(int y=0 ; y < personChilds.getLength(); y++){
				if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点
					Element childElement = (Element)personChilds.item(y);
					if("name".equals(childElement.getNodeName())){
						person.setName(childElement.getFirstChild().getNodeValue());
					}else if("age".equals(childElement.getNodeName())){
						person.setAge(new Short(childElement.getFirstChild().getNodeValue()));
					}
				}
			}
			persons.add(person);
		}
		return persons;
	}
}

 3.Pull

public class PULLPersonService {
	
	public static void save(List<Person> persons, Writer writer) throws Throwable{
		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(writer);
		serializer.startDocument("UTF-8", true);
		
		serializer.startTag(null, "persons");
		for(Person person : persons){
			serializer.startTag(null, "person");
			serializer.attribute(null, "id", person.getId().toString());
			
			serializer.startTag(null, "name");
			serializer.text(person.getName());
			serializer.endTag(null, "name");
			
			serializer.startTag(null, "age");
			serializer.text(person.getAge().toString());
			serializer.endTag(null, "age");
			
			serializer.endTag(null, "person");
		}
		serializer.endTag(null, "persons");		
		serializer.endDocument();
		writer.flush();
		writer.close();
	}

	public static List<Person> getPersons(InputStream inStream) throws Throwable{
		List<Person> persons = null;
		Person person = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inStream, "UTF-8");
		int eventType = parser.getEventType();//产生第一个事件
		while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
	
			case XmlPullParser.START_TAG:
				String name = parser.getName();//获取解析器当前指向的元素的名称
				if("person".equals(name)){
					person = new Person();
					person.setId(new Integer(parser.getAttributeValue(0)));
				}
				if(person!=null){
					if("name".equals(name)){
						person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
					}
					if("age".equals(name)){
						person.setAge(new Short(parser.nextText()));
					}
				}
				break;
				
			case XmlPullParser.END_TAG:
				if("person".equals(parser.getName())){
					persons.add(person);
					person = null;
				}
				break;
			}
			eventType = parser.next();
		}
		return persons;
	}
}

  测试类

public class PersonServiceTest extends AndroidTestCase {
	private static final String TAG = "PersonServiceTest";

	public void testSAXGetPersons() throws Throwable{
		SAXPersonService service = new SAXPersonService();
		InputStream inStream = getClass().getClassLoader().getResourceAsStream("itcast.xml");
		List<Person> persons = service.getPersons(inStream);
		for(Person person : persons){
			Log.i(TAG, person.toString());    
		}
	}
	
	public void testDomGetPersons() throws Throwable{
		InputStream inStream = getClass().getClassLoader().getResourceAsStream("itcast.xml");
		List<Person> persons = DOMPersonService.getPersons(inStream);
		for(Person person : persons){
			Log.i(TAG, person.toString());
		}
	}
	
	public void testPullGetPersons() throws Throwable{
		InputStream inStream = getClass().getClassLoader().getResourceAsStream("itcast.xml");
		List<Person> persons = PULLPersonService.getPersons(inStream);
		for(Person person : persons){
			Log.i(TAG, person.toString());
		}
	}
	
	public void testSave() throws Throwable{
		//File file = new File(this.getContext().getFilesDir(), "person.xml");
		//FileOutputStream outStream = new FileOutputStream(file);
		List<Person> persons = new ArrayList<Person>();
		persons.add(new Person(34, "lili", (short)12));
		persons.add(new Person(56, "老毕", (short)32));
		persons.add(new Person(39, "老张", (short)40));
		/*FileOutputStream outStream = this.getContext().openFileOutput("person.xml", Context.MODE_PRIVATE);
		OutputStreamWriter writer = new OutputStreamWriter(outStream, "UTF-8");
		BufferedWriter bWriter = new BufferedWriter(writer);
		*/
		StringWriter writer = new StringWriter();
		PULLPersonService.save(persons, writer);
		Log.i(TAG, writer.toString());
	}
}

猜你喜欢

转载自lijun2087.iteye.com/blog/1754757