Android用Sax,Pull,Dom解析xml
16lz
2021-01-26
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 @Override15 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 Sax17 {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 block31 e.printStackTrace();32 } catch (SAXException e) {33 // TODO Auto-generated catch block34 e.printStackTrace();35 } catch (IOException e) {36 // TODO Auto-generated catch block37 e.printStackTrace();38 }39 return null;40 }41 }42 43 class XMLContentHandler extends DefaultHandler44 {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 SAXException55 {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 SAXException76 {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 SAXException86 {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 Pull14 {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 block70 e.printStackTrace();71 } catch (IOException e) {72 // TODO Auto-generated catch block73 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 Dom19 {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 block55 e.printStackTrace();56 } catch (IOException e) {57 // TODO Auto-generated catch block58 e.printStackTrace();59 } catch (SAXException e) {60 // TODO Auto-generated catch block61 e.printStackTrace();62 }63 return persons;64 }65 }
更多相关文章
- mono for android之文件系统与应用程序首选项
- android之JSON解析(一)
- android之简单数据存储Preference
- layout设计 屏幕适配
- Android(安卓)播放 Gif 图片控件
- android apkbuilder.bat批处理
- Android(安卓)SDK三种更新失败及其解决方法
- android系统内存管理知识(一)
- android 导出带数据库文件的APK