XML介紹:Extensible Markup Language,便可擴展標記語言html
Android中解析XML格式數據大體有三種方法:android
SAX(Simple API for XML)
使用流式處理的方式,它並不記錄所讀內容的相關信息。git
它是一種以事件爲驅動的XML API,解析速度快,佔用內存少。使用回調函數來實現。github
缺點是不能倒退。編程
DOM(Document Object Model)
是一種用於XML文檔的對象模型,可用於直接訪問 XML 文檔的各個部分。dom
它是一次性所有將內容加載在內存中,生成一個樹狀結構,它沒有涉及回調和複雜的狀態管理。函數
缺點是加載大文檔時效率低下。佈局
Pull
內置於 Android 系統中。也是官方解析佈局文件所使用的方式。ui
Pull 與 SAX 有點相似,都提供了相似的事件,如開始元素和結束元素。this
不一樣的是,SAX 的事件驅動是回調相應方法,須要提供回調的方法,然後在 SAX 內部自動調用相應的方法。
而Pull解析器並無強制要求提供觸發的方法。由於他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。
SAX、DOM、Pull 的比較:
內存佔用:SAX、Pull比DOM要好;
編程方式:SAX 採用事件驅動,在相應事件觸發的時候,會調用用戶編好的方法,也即每解析一類 XML,就要編寫一個新的適合該類XML的處理類。DOM 是 W3C 的規範,Pull 簡潔。
訪問與修改:SAX 採用流式解析,DOM 隨機訪問。
訪問方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。
http://www.saxproject.org/quickstart.html
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; } }
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()); } }
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; } }
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()); } }
此文在個人 Github Pages 上同步發佈,地址爲:Android中解析XML格式數據的方法