XML介绍:Extensible Markup Language,即可扩展标记语言
一、概述
Android中解析XML格式数据大致有三种方法:
二、详解
2.1 SAX
SAX(Simple API for XML)
使用流式处理的方式,它并不记录所读内容的相关信息。
它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。
缺点是不能倒退。
2.2 DOM
DOM(Document Object Model)
是一种用于XML文档的对象模型,可用于直接访问 XML 文档的各个部分。
它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。
缺点是加载大文档时效率低下。
2.3 PULL
Pull
内置于 Android 系统中。也是官方解析布局文件所使用的方式。
Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。
不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。
而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。
三、比较
SAX、DOM、Pull 的比较:
内存占用:SAX、Pull比DOM要好;
编程方式:SAX 采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类 XML,就要编写一个新的适合该类XML的处理类。DOM 是 W3C 的规范,Pull 简洁。
访问与修改:SAX 采用流式解析,DOM 随机访问。
访问方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。
四、使用举例
4.1 SAX 解析举例
http://www.saxproject.org/quickstart.html
4.2 DOM 解析举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class DomPersonService { /** * @param inStream * @return * @throws Exception */ public static List<Person> getPersons(InputStream inStream) throws Exception { List<Person> persons = new ArrayList<Person>(); /** * 文檔的解析 */ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inStream); /** * 操作對象樹 */ Element root = document.getDocumentElement();//返回文檔的根元素 NodeList personNodes = root.getElementsByTagName("person"); for (int i = 0; i < personNodes.getLength(); i++) { Element personElement = (Element) personNodes.item(i); int id = new Integer(personElement.getAttribute("id")); Person person = new Person(); person.setId(id); NodeList childNodes = personElement.getChildNodes(); for (int y = 0; y < childNodes.getLength(); y++) { if (childNodes.item(y).getNodeType() == Node.ELEMENT_NODE) { if ("name".equals(childNodes.item(y).getNodeName())) { String name = childNodes.item(y).getFirstChild() .getNodeValue(); person.setName(name); } else if ("age".equals(childNodes.item(y).getNodeName())) { String age = childNodes.item(y).getFirstChild() .getNodeValue(); person.setAge(new Short(age)); } } } persons.add(person); } inStream.close(); return persons; } }
|
1 2 3 4 5 6 7 8
| public void testDOMGetPersons() throws Throwable { InputStream inStream = this.getClass().getClassLoader() .getResourceAsStream("person.xml"); List<Person> persons = DomPersonService.getPersons(inStream); for (Person person : persons) { Log.i(TAG, person.toString()); } }
|
4.3 PULL解析举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class PullPersonService { /** * ------------------------使用PULL解析XML----------------------- * @param inStream * @return * @throws Exception */ public static List<Person> getPersons(InputStream inStream) throws Exception { Person person = null; List<Person> persons = null; XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(inStream, "UTF-8"); int event = pullParser.getEventType();// 觸發第一個事件 while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: if ("person".equals(pullParser.getName())) { int id = new Integer(pullParser.getAttributeValue(0)); person = new Person(); person.setId(id); } if (person != null) { if ("name".equals(pullParser.getName())) { person.setName(pullParser.nextText()); } if ("age".equals(pullParser.getName())) { person.setAge(new Short(pullParser.nextText())); } } break; case XmlPullParser.END_TAG: if ("person".equals(pullParser.getName())) { persons.add(person); person = null; } break; } event = pullParser.next(); } return persons; } }
|
1 2 3 4 5 6 7 8
| public void testPullGetPersons() throws Throwable { InputStream inStream = this.getClass().getClassLoader() .getResourceAsStream("person.xml"); List<Person> persons = PullPersonService.getPersons(inStream); for (Person person : persons) { Log.i(TAG, person.toString()); } }
|