Android解析xml的三种方式。分别有Sax,Pull,Dom。
来看他们各是怎么实现的。
这是项目结构:
解析文件为Person.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <persons> 3 <person id="1"> 4 <name>cxa</name> 5 <age>30</age> 6 </person> 7 <person id="2"> 8 <name>acs</name> 9 <age>25</age> 10 </person> 11 <person id="3"> 12 <name>hgf</name> 13 <age>30</age> 14 </person> 15 <person id="4"> 16 <name>rty</name> 17 <age>25</age> 18 </person> 19 <person id="5"> 20 <name>gfj</name> 21 <age>30</age> 22 </person> 23 <person id="6"> 24 <name>qty</name> 25 <age>25</age> 26 </person> 27 <person id="7"> 28 <name>bdf</name> 29 <age>30</age> 30 </person> 31 <person id="8"> 32 <name>liu</name> 33 <age>25</age> 34 </person> 35 </persons>
分别来看各个文件实现。
XmlParserActivity.java:
1 package com.jayce.xmlparser; 2 3 import java.io.InputStream; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.util.Log; 9 10 public class XmlParserActivity extends Activity { 11 private static final String TAG = "XmlParserActivity"; 12 13 /** Called when the activity is first created. */ 14 @Override 15 public void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.main); 18 InputStream in = this.getResources().openRawResource(R.raw.person); 19 List<Person> person = Pull.readXML(in); 20 if(null != person) 21 { 22 for(int i = 0; i < person.size(); i++) 23 { 24 Log.i(TAG, "index:" + i); 25 Person p = person.get(i); 26 Log.i(TAG, "id:" + p.getID()); 27 Log.i(TAG, "name:" + p.getName()); 28 Log.i(TAG, "age:" + p.getAge()); 29 } 30 } 31 } 32 }
Person.java:
1 package com.jayce.xmlparser; 2 3 public class Person 4 { 5 private Integer mID; 6 private String mName; 7 private Short mAge; 8 9 public Integer getID() 10 { 11 return mID; 12 } 13 14 public void setID(Integer id) 15 { 16 this.mID = id; 17 } 18 19 public String getName() 20 { 21 return mName; 22 } 23 24 public void setName(String name) 25 { 26 this.mName = name; 27 } 28 29 public Short getAge() 30 { 31 return mAge; 32 } 33 34 public void setAge(Short age) 35 { 36 this.mAge = age; 37 } 38 }
Sax.java:
1 package com.jayce.xmlparser; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import javax.xml.parsers.ParserConfigurationException; 9 import javax.xml.parsers.SAXParser; 10 import javax.xml.parsers.SAXParserFactory; 11 12 import org.xml.sax.Attributes; 13 import org.xml.sax.SAXException; 14 import org.xml.sax.helpers.DefaultHandler; 15 16 public class Sax 17 { 18 public static List<Person> readXML(InputStream in) 19 { 20 SAXParserFactory spf = SAXParserFactory.newInstance(); 21 try { 22 SAXParser saxParser = spf.newSAXParser(); 23 //saxParser.setProperty("http://xml.org/sax/features/namespaces", true); 24 //saxParser.setProperty("http://xml.org/sax/features/namespace-prefixes", false); 25 XMLContentHandler handler = new XMLContentHandler(); 26 saxParser.parse(in, handler); 27 in.close(); 28 return handler.getPersons(); 29 } catch (ParserConfigurationException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } catch (SAXException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } catch (IOException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 return null; 40 } 41 } 42 43 class XMLContentHandler extends DefaultHandler 44 { 45 private List<Person> persons = null; 46 private Person currentPerson; 47 private String tagName = null; 48 49 public List<Person> getPersons() 50 { 51 return persons; 52 } 53 54 public void startDocument() throws SAXException 55 { 56 persons = new ArrayList<Person>(); 57 } 58 59 public void characters(char[] ch, int start, int length) 60 { 61 if(null != tagName) 62 { 63 String data = new String(ch, start, length); 64 if(tagName.equalsIgnoreCase("name")) 65 { 66 this.currentPerson.setName(data); 67 } 68 else if(tagName.equalsIgnoreCase("age")) 69 { 70 this.currentPerson.setAge(new Short(data)); 71 } 72 } 73 } 74 75 public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException 76 { 77 this.tagName = localName; 78 if(tagName.equalsIgnoreCase("person")) 79 { 80 currentPerson = new Person(); 81 currentPerson.setID(new Integer(atts.getValue("id"))); 82 } 83 } 84 85 public void endElement(String uri, String localName, String name) throws SAXException 86 { 87 if(localName.equalsIgnoreCase("person")) 88 { 89 persons.add(currentPerson); 90 currentPerson = null; 91 } 92 this.tagName = null; 93 } 94 }
Pull.java:
1 package com.jayce.xmlparser; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import org.xmlpull.v1.XmlPullParser; 9 import org.xmlpull.v1.XmlPullParserException; 10 11 import android.util.Xml; 12 13 public class Pull 14 { 15 public static List<Person> readXML(InputStream in) 16 { 17 XmlPullParser parser = Xml.newPullParser(); 18 19 try { 20 parser.setInput(in, "UTF-8"); 21 int eventType = parser.getEventType(); 22 Person currentPerson = null; 23 List<Person> persons = null; 24 while(eventType != XmlPullParser.END_DOCUMENT) 25 { 26 switch(eventType) 27 { 28 case XmlPullParser.START_DOCUMENT: 29 { 30 persons = new ArrayList<Person>(); 31 } 32 break; 33 case XmlPullParser.START_TAG: 34 { 35 String tag = parser.getName(); 36 if(tag.equalsIgnoreCase("person")) 37 { 38 currentPerson = new Person(); 39 currentPerson.setID(new Integer(parser.getAttributeValue(null, "id"))); 40 } 41 else if(currentPerson != null) 42 { 43 if(tag.equalsIgnoreCase("name")) 44 { 45 currentPerson.setName(parser.nextText()); 46 } 47 else if(tag.equalsIgnoreCase("age")) 48 { 49 currentPerson.setAge(new Short(parser.nextText())); 50 } 51 } 52 } 53 break; 54 case XmlPullParser.END_TAG: 55 { 56 if(parser.getName().equalsIgnoreCase("person") && null != currentPerson) 57 { 58 persons.add(currentPerson); 59 currentPerson = null; 60 } 61 } 62 break; 63 } 64 eventType = parser.next(); 65 } 66 in.close(); 67 return persons; 68 } catch (XmlPullParserException e) { 69 // TODO Auto-generated catch block 70 e.printStackTrace(); 71 } catch (IOException e) { 72 // TODO Auto-generated catch block 73 e.printStackTrace(); 74 } 75 76 return null; 77 } 78 }
Dom.java:
1 package com.jayce.xmlparser; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import javax.xml.parsers.DocumentBuilder; 9 import javax.xml.parsers.DocumentBuilderFactory; 10 import javax.xml.parsers.ParserConfigurationException; 11 12 import org.w3c.dom.Document; 13 import org.w3c.dom.Element; 14 import org.w3c.dom.Node; 15 import org.w3c.dom.NodeList; 16 import org.xml.sax.SAXException; 17 18 public class Dom 19 { 20 public static List<Person> readXML(InputStream in) 21 { 22 List<Person> persons = new ArrayList<Person>(); 23 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 24 try { 25 DocumentBuilder builder = factory.newDocumentBuilder(); 26 Document dom = builder.parse(in); 27 Element root = dom.getDocumentElement(); 28 NodeList items = root.getElementsByTagName("person"); 29 for(int i = 0; i < items.getLength(); i++) 30 { 31 Person person = new Person(); 32 Element personNode = (Element)items.item(i); 33 person.setID(new Integer(personNode.getAttribute("id"))); 34 NodeList childsNodes = personNode.getChildNodes(); 35 for(int j = 0; j < childsNodes.getLength(); j++) 36 { 37 Node node = (Node)childsNodes.item(j); 38 if(Node.ELEMENT_NODE == node.getNodeType()) 39 { 40 if("name".equalsIgnoreCase(node.getNodeName())) 41 { 42 person.setName(node.getFirstChild().getNodeValue()); 43 } 44 else if("age".equalsIgnoreCase(node.getNodeName())) 45 { 46 person.setAge(new Short(node.getFirstChild().getNodeValue())); 47 } 48 } 49 } 50 persons.add(person); 51 } 52 in.close(); 53 } catch (ParserConfigurationException e) { 54 // TODO Auto-generated catch block 55 e.printStackTrace(); 56 } catch (IOException e) { 57 // TODO Auto-generated catch block 58 e.printStackTrace(); 59 } catch (SAXException e) { 60 // TODO Auto-generated catch block 61 e.printStackTrace(); 62 } 63 return persons; 64 } 65 }