標籤:lis star word type 比較 final title *** person
52371342
一、使用SAX解析XML
SAX(Simple API for XML) 使用串流的方式,它並不記錄所讀內容的相關資訊。它是一種以事件為驅動的XML API,解析速度快,佔用記憶體少。使用回呼函數來實現。 缺點是不能倒退。
二、使用DOM解析XML
DOM(Document Object Model) 是一種用於XML文檔的物件模型,可用於直接存取XML文檔的各個部分。它是一次性全部將內容載入在記憶體中,產生一個樹狀結構,它沒有涉及回調和複雜的狀態管理。 缺點是載入大文檔時效率低下。
三、使用Pull解析XML
Pull內建於Android系統中。也是官方解析布局檔案所使用的方式。Pull與SAX有點類似,都提供了類似的事件,如開始元素和結束元素。不同的是,SAX的事件驅動是回調相應方法,需要提供回調的方法,而後在SAX內部自動調用相應的方法。而Pull解析器並沒有強制要求提供觸發的方法。因為他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。
四、SAX、DOM、Pull的比較:
- 記憶體佔用:SAX、Pull比DOM要好;
- 編程方式:SAX採用事件驅動,在相應事件觸發的時候,會調用使用者編好的方法,也即每解析一類XML,就要編寫一個新的適合該類XML的處理類。DOM是W3C的規範,Pull簡潔。
- 訪問與修改:SAX採用流式解析,DOM隨機訪問。
- 訪問方式:SAX,Pull解析的方式是同步的,DOM逐字逐句。
四、各種解析舉例1、SAX解析舉例
解析代碼:
public class SAXForHandler extends DefaultHandler { /** * -----------------SAX解析XML---------------------- */ private static final String TAG = "SAXForHandler"; private List<Person> persons; private String perTag;// 通過此變數,記錄前一個標籤的名稱 Person person;// 記錄當前Person public List<Person> getPersons() { return persons; } @Override public void characters(char[] ch, int start, int length) throws SAXException { String data = new String(ch, start, length).trim(); if ( ! "".equals(data.trim())) { Log.i(TAG, "content: " + data.trim()); } if ("name".equals(perTag)) { person.setName(data); } else if ("age".equals(perTag)) { person.setAge(new Short(data)); } super.characters(ch, start, length); } @Override public void endDocument() throws SAXException { Log.i(TAG, "***endDocument()***"); super.endDocument(); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { Log.i(TAG, qName + "***endElement()***"); if ("person".equals(localName)) { persons.add(person); person = null; } perTag = null; super.endElement(uri, localName, qName); } @Override public void startDocument() throws SAXException { persons = new ArrayList<Person>(); Log.i(TAG, "***startDocument()***"); super.startDocument(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//localName標籤名,fullName帶命名空間的標籤名,attribute存放該標籤所有屬性 if ("person".equals(localName)) { for (int i = 0; i < attributes.getLength(); i++) { Log.i(TAG, "attributeName:" + attributes.getLocalName(i) + "_attribute_Value:" + attributes.getValue(i)); person = new Person(); person.setId(Integer.valueOf(attributes.getValue(i))); // person.setId(Integer.parseInt(attributes.getValue(i))); } } perTag = localName; Log.i(TAG, qName + "***startElement()***"); super.startElement(uri, localName, qName, attributes); }}
- 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
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
使用SAX解析:
/** * *****************************使用SAX解析XML檔案******************* * 輸入資料流是指向程式中讀入資料 * @throws Throwable */public void testSAXGetPersons() throws Throwable { InputStream inputStream = this.getClass().getClassLoader() .getResourceAsStream("person.xml"); SAXForHandler saxForHandler = new SAXForHandler(); /** * 用工廠模式解析XML */ SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser saxParser = spf.newSAXParser(); saxParser.parse(inputStream, saxForHandler); // 第二種方式解析XML // XMLReader xmlReader = saxParser.getXMLReader(); // xmlReader.setContentHandler(handler); // xmlReader.parse(new InputSource(inputStream)); List<Person> persons = saxForHandler.getPersons(); inputStream.close(); for (Person person : persons) { Log.i(TAG, person.toString()); }}
- 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
2、DOM解析舉例
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
- 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
使用DOM解析XML檔案
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()); }}
3、PULL解析舉例
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
- 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
PULL解析XML檔案
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()); }}
Android幾種解析XML方式的比較