本来一直忙着期末考试的复习,但复习挺无聊的,偶然看到xml的解析方法,虽然以前做过,但感觉不是很熟悉了,所以抽点时间一口气把三种方式都复习了遍。这三种方法中DOM最耗内存,因为它是把整个文件加载进去然后进行分类整理的,PULL和SAX类似,只是SAX要用到一个解析类,类中的主要三个方法完成内容的解析,而PULL方法是Android特有的,根据获得的标签判断并解析,这也是安卓中最常使用的方法。
接下来给大家复习下,因为我觉得看代码更容易明白,讲解的就不多了。
首先我们准备好我们要解析的资源文件和封装好的javaBean。
person.xml
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>sax</name> <age>12</age> </person> <person id="2"> <name>ganganrou</name> <age>17</age> </person> <person id="3"> <name>nuanwozi</name> <age>5</age> </person> </persons>
public class PersonBean { int id; String name; String age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "PersonBean [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
一、DOM
public static List<PersonBean> getPersonBeans() { List<PersonBean> list = new ArrayList<PersonBean>(); DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); try { DocumentBuilder builder = builderFactory.newDocumentBuilder(); Document document = builder.parse(DomPaserHelper.class .getClassLoader().getResourceAsStream("person2.xml")); Element element = document.getDocumentElement(); NodeList nodeList = element.getElementsByTagName("person"); for (int i = 0; i < nodeList.getLength(); i++) { Element node = (Element) nodeList.item(i); PersonBean bean = new PersonBean(); bean.setId(Integer.valueOf(node.getAttribute("id"))); NodeList list2 = node.getChildNodes(); for (int j = 0; j < list2.getLength(); j++) { Node element2 = list2.item(j); <span style="color:#ff6600;">// 判断子Note的类型为元素Note</span> if (element2.getNodeType() == Node.ELEMENT_NODE) { Element childElement = (Element) element2; if ("name".equals(childElement.getNodeName())) { bean.setName(childElement.<span style="color:#ff6600;">getFirstChild</span>() .getNodeValue()); } if ("age".equals(childElement.getNodeName())) { bean.setAge(childElement.<span style="color:#ff6600;">getFirstChild</span>() .getNodeValue()); } } } list.add(bean); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
public static List<PersonBean> getPersonBeans() { List<PersonBean> list = null; boolean f = false; PersonBean bean = null; XmlPullParserFactory pullParserFactory; try { pullParserFactory = XmlPullParserFactory.newInstance(); XmlPullParser parser = pullParserFactory.newPullParser(); parser.setInput(PullPaserHelper.class.getClassLoader() .getResourceAsStream("person3.xml"), "utf-8"); int tag = parser.getEventType(); while (tag != XmlPullParser.END_DOCUMENT) { switch (tag) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<PersonBean>(); break; case XmlPullParser.START_TAG: String str = parser.getName(); if (str.equals("person")) { bean = new PersonBean(); bean.setId(Integer.valueOf(parser.getAttributeValue(0))); f = true; } if (f&&bean!=null) { if ("name".equals(str)) { bean.setName(parser.nextText()); } if ("age".equals(str)) { bean.setAge(parser.nextText()); } } break; case XmlPullParser.END_TAG: String con = parser.getName(); if (con.equals("person") && bean != null) { list.add(bean); bean = null; f = false; } break; default: break; } tag = parser.next(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
public class SaxHanderHelper extends DefaultHandler { List<PersonBean> personBeans; String tag; public List<PersonBean> getPersonBeans() { return personBeans; } public SaxHanderHelper() { // TODO Auto-generated constructor stub personBeans = new ArrayList<PersonBean>(); } PersonBean bean; @Override public void startElement(String uri, String localName, String qName, //在这里获取标签和标签的属性 Attributes attributes) throws SAXException { // TODO Auto-generated method stub if (localName.equals("person")) { bean = new PersonBean(); for (int i = 0; i < attributes.getLength(); i++) { bean.setId(Integer.valueOf(attributes.getValue(i))); } } tag = localName; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub if (localName.equals("person") && bean != null) { personBeans.add(bean); bean = null; } tag = null; } @Override public void characters(char[] ch, int start, int length)//在这里获取标签的值 throws SAXException { // TODO Auto-generated method stub String content = new String(ch, start, length).trim(); if (tag != null) { if (tag.equals("age")) { bean.setAge(content); } if (tag.equals("name")) { bean.setName(content); } } } }
调用方法:
SAXParser saxParser = factory.newSAXParser(); SaxHanderHelper handerHelper = new SaxHanderHelper(); saxParser.parse(getInputStream(), handerHelper); List<PersonBean> beans = handerHelper.getPersonBeans();
【Android高级】XMl文件的DOM、SAX、PULL三种解析方式全解
原文地址:http://blog.csdn.net/scboyhj__/article/details/42124189