Android解析xml文件-采用DOM,PULL,SAX三种方法解析
解析如下xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <persons> 3 <person id="1"> 4 <name>GIS</name> 5 <age>23</age> 6 </person> 7 <person id="2"> 8 <name>ArcGIS</name> 9 <age>24</age> 10 </person> 11 </persons>
创建一个person对象
1 public class Person { 2 private Integer id; 3 private String name; 4 private Short age; 5 6 public Person(){} 7 8 public Person(Integer id, String name, Short age) { 9 super(); 10 this.id = id; 11 this.name = name; 12 this.age = age; 13 } 14 @Override 15 public String toString() { 16 return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; 17 } 18 public Integer getId() { 19 return id; 20 } 21 public void setId(Integer id) { 22 this.id = id; 23 } 24 public String getName() { 25 return name; 26 } 27 public void setName(String name) { 28 this.name = name; 29 } 30 public Short getAge() { 31 return age; 32 } 33 public void setAge(Short age) { 34 this.age = age; 35 } 36 37 }
1.dom解析
1 import java.io.InputStream; 2 import java.util.ArrayList; 3 import java.util.List; 4 5 import javax.xml.parsers.DocumentBuilder; 6 import javax.xml.parsers.DocumentBuilderFactory; 7 8 import org.w3c.dom.Document; 9 import org.w3c.dom.Element; 10 import org.w3c.dom.Node; 11 import org.w3c.dom.NodeList; 12 /** 13 * DOM解析XML 14 * @author GIS 15 * 16 */ 17 public class DOMService { 18 public List<Person> getHongXml(InputStream inStream) throws Throwable { 19 List<Person> persons = new ArrayList<Person>(); 20 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 21 DocumentBuilder builder = factory.newDocumentBuilder(); 22 Document document = builder.parse(inStream);//结束后以文档树的方式存放在内存 23 Element root = document.getDocumentElement(); 24 NodeList persoNodes = root.getElementsByTagName("person"); 25 for (int i = 0; i < persoNodes.getLength(); i++) { 26 Person person = new Person(); 27 Element personElement = (Element)persoNodes.item(i); 28 person.setId(new Integer(personElement.getAttribute("id"))); 29 NodeList personChilds = personElement.getChildNodes(); 30 for (int j = 0; j < personChilds.getLength(); j++) { 31 if (personChilds.item(j).getNodeType() == Node.ELEMENT_NODE) {//判断当前节点是否是元素类型节点 32 Element childElement = (Element)personChilds.item(j); 33 if ("name".equals(childElement.getNodeName())) { 34 person.setName(childElement.getFirstChild().getNodeValue()); 35 }else if ("age".equals(childElement.getNodeName())) { 36 person.setAge(new Short(childElement.getFirstChild().getNodeValue())); 37 } 38 } 39 } 40 persons.add(person); 41 } 42 return persons; 43 } 44 45 }
2.pull解析
1 import java.io.InputStream; 2 import java.io.OutputStream; 3 import java.io.Writer; 4 import java.util.ArrayList; 5 import java.util.List; 6 import org.xmlpull.v1.XmlPullParser; 7 import org.xmlpull.v1.XmlSerializer; 8 9 import android.util.Xml; 10 import yu.entity.Person; 11 12 /** 13 * 采用Pull解析器解析XML内容 14 * 15 * @author GIS 16 * 17 */ 18 public class PullService { 19 /** 20 * 采用Pull解析器生成XML内容 21 * @param persons 22 * @param outputStream 23 * @throws Throwable 24 */ 25 public static void save(List<Person> persons, OutputStream outputStream) 26 throws Throwable { 27 XmlSerializer serializer = Xml.newSerializer(); 28 serializer.setOutput(outputStream, "UTF-8"); 29 serializer.startDocument("UTF-8", true); 30 serializer.startTag(null, "persons"); 31 for (Person person : persons) { 32 serializer.startTag(null, "person"); 33 serializer.attribute(null, "id", person.getId().toString()); 34 35 serializer.startTag(null, "name"); 36 serializer.text(person.getName()); 37 serializer.endTag(null, "name"); 38 39 serializer.startTag(null, "age"); 40 serializer.text(person.getAge().toString()); 41 serializer.endTag(null, "age"); 42 43 serializer.endTag(null, "person"); 44 } 45 46 serializer.endTag(null, "persons"); 47 serializer.endDocument(); 48 outputStream.flush(); 49 outputStream.close(); 50 } 51 52 /** 53 * 采用Pull解析器生成XML内容,使用Writer 54 * @param persons 55 * @param writer 56 * @throws Throwable 57 */ 58 public static void saveWrite(List<Person> persons, Writer writer) 59 throws Throwable { 60 XmlSerializer serializer = Xml.newSerializer(); 61 serializer.setOutput(writer); 62 serializer.startDocument("UTF-8", true); 63 serializer.startTag(null, "persons"); 64 for (Person person : persons) { 65 serializer.startTag(null, "person"); 66 serializer.attribute(null, "id", person.getId().toString()); 67 68 serializer.startTag(null, "name"); 69 serializer.text(person.getName()); 70 serializer.endTag(null, "name"); 71 72 serializer.startTag(null, "age"); 73 serializer.text(person.getAge().toString()); 74 serializer.endTag(null, "age"); 75 76 serializer.endTag(null, "person"); 77 } 78 79 serializer.endTag(null, "persons"); 80 serializer.endDocument(); 81 writer.flush(); 82 writer.close(); 83 } 84 85 /** 86 * 采用Pull解析器解析XML内容 87 * 88 * @param inStream 89 * @return 90 * @throws Throwable 91 */ 92 public List<Person> getHongXml(InputStream inStream) throws Throwable { 93 List<Person> persons = null; 94 Person person = null; 95 XmlPullParser parser = Xml.newPullParser(); 96 parser.setInput(inStream, "UTF-8"); 97 int eventType = parser.getEventType();// 产生第一个事件 98 while (eventType != XmlPullParser.END_DOCUMENT) {// 只要不是文档事件就一直循环 99 switch (eventType) { 100 case XmlPullParser.START_DOCUMENT: 101 persons = new ArrayList<Person>(); 102 break; 103 case XmlPullParser.START_TAG: 104 String name = parser.getName();// 获得解析器当前指向的元素的名称 105 if ("person".equals(name)) { 106 person = new Person(); 107 person.setId(Integer.valueOf(parser.getAttributeValue(0))); 108 } else if (person != null) { 109 if ("name".equals(name)) { 110 person.setName(parser.nextText());// 获取解析器当前元素的下一个文本节点的值 111 } else if ("age".equals(name)) { 112 person.setAge(Short.valueOf(parser.nextText())); 113 } 114 } 115 break; 116 case XmlPullParser.END_TAG: 117 if ("person".equals(parser.getName())) { 118 persons.add(person); 119 person = null; 120 } 121 break; 122 } 123 124 eventType = parser.next(); 125 } 126 return persons; 127 128 } 129 public static Integer lastId(InputStream inStream) throws Throwable{ 130 int id = 0; 131 XmlPullParser parser = Xml.newPullParser(); 132 parser.setInput(inStream, "UTF-8"); 133 int eventType = parser.getEventType();// 产生第一个事件 134 do { 135 if (eventType == XmlPullParser.START_TAG) { 136 String name = parser.getName();// 获得解析器当前指向的元素的名称 137 if ("person".equals(name)) { 138 id = Integer.valueOf(parser.getAttributeValue(0)); 139 } 140 } 141 eventType = parser.next(); 142 } while (eventType != XmlPullParser.END_DOCUMENT); 143 return id; 144 } 145 146 }
3.SAXServer解析
1 import java.io.InputStream; 2 import java.util.ArrayList; 3 import java.util.List; 4 import javax.xml.parsers.SAXParser; 5 import javax.xml.parsers.SAXParserFactory; 6 7 import org.xml.sax.Attributes; 8 import org.xml.sax.SAXException; 9 import org.xml.sax.helpers.DefaultHandler; 10 /** 11 * 采用SAX解析XML 12 * @author GIS 13 * 14 */ 15 public class SAXService { 16 17 public List<Person> getHongXml(InputStream inStream) throws Throwable { 18 SAXParserFactory factory = SAXParserFactory.newInstance(); 19 SAXParser parser = factory.newSAXParser(); 20 ContentParser contentParser = new ContentParser(); 21 parser.parse(inStream, contentParser); 22 inStream.close(); 23 return contentParser.getPersons(); 24 } 25 private final class ContentParser extends DefaultHandler{ 26 private List<Person> persons = null; 27 public List<Person> getPersons() { 28 return persons; 29 } 30 31 private String tag = null; 32 private Person person = null; 33 @Override 34 public void startDocument() throws SAXException { 35 persons = new ArrayList<Person>(); 36 } 37 38 @Override 39 public void startElement(String uri, String localName, String qName, 40 Attributes attributes) throws SAXException { 41 if ("person".equals(localName)) { 42 person = new Person(); 43 person.setId(new Integer(attributes.getValue(0))); 44 } 45 tag = localName; 46 } 47 48 @Override 49 public void endElement(String uri, String localName, String qName) 50 throws SAXException { 51 if ("person".equals(localName)) { 52 persons.add(person); 53 person =null; 54 } 55 tag = null; 56 } 57 58 @Override 59 public void characters(char[] ch, int start, int length) 60 throws SAXException { 61 if (tag != null) { 62 String data = new String(ch, start, length);//获取文本节点的数据 63 if ("name".equals(tag)) { 64 person.setName(data); 65 }else if ("age".equals(tag)) { 66 person.setAge(new Short(data)); 67 } 68 } 69 } 70 71 } 72 73 }
调用,这里举例用sax调用
1 SAXService service = new SAXService(); 2 InputStream inStream = getClass().getClassLoader().getResourceAsStream( 3 "×××.xml");//放在src下,或此处变成网络路径下 4 List<Person> persons = service.getHongXml(inStream); 5 for (Person person : persons) { 6 Log.i(TAG, person.toString()); 7 }