android开发第四天xml文件解析
1.sax方式
/** * 使用sax解析 */ public class SaxParse{ /** * sax解析器 */ private SAXParser parser; public SaxParse(){ try { SAXParserFactory f = SAXParserFactory.newInstance(); parser = f.newSAXParser(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public List<Person> doParse(InputStream is) { try { XmlHandler h = new XmlHandler(); parser.parse(is,h); return h.getpersons(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 处理器 */ class XmlHandler extends DefaultHandler{ List<Person> persons = null ; Person person = null ; //当前元素名称 private String currEleName; /** * 文本节点触发该方法 */ public void characters(char[] ch, int start, int length)throws SAXException { String str = new String(ch,start,length); //name if("name".equals(currEleName)){ person.name = str ; } else if("age".equals(currEleName)){ person.age = Integer.parseInt(str); } } public void endDocument() throws SAXException { } /** * 元素结束 */ public void endElement(String uri, String localName, String qName) throws SAXException { if("person".equals(localName)){ persons.add(person); } //将当前元素置空 else if(("name".equals(currEleName)) || ("age".equals(currEleName))){ this.currEleName = "" ; } } /** * 文档开始事件 */ public void startDocument() throws SAXException { persons = new ArrayList<Person>(); } /** * 元素开始事件 * localName:本地名 * uri:名字空间 * qName:限定名,前缀 + 本地名 */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //实例化person对象 if("person".equals(localName)){ person = new Person(); person.id = Integer.parseInt(attributes.getValue(0)); } //name元素 else if("name".equals(localName)){ this.currEleName = "name" ; } //name元素 else if("age".equals(localName)){ this.currEleName = "age" ; } } public List<Person> getpersons(){ return persons ; } } }
2.dom方式
/** * DOM解析 */ public class DomParse{ // private DocumentBuilder builder; public DomParse(){ try { DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); this.builder = f.newDocumentBuilder(); } catch (Exception e) { e.printStackTrace(); } } public List<Person> doParse(InputStream is) { List<Person> persons = new ArrayList<Person>(); Person person = null ; try { Document doc = builder.parse(is); NodeList list = doc.getElementsByTagName("person"); Element ele = null ; for(int i = 0 ; i < list.getLength() ; i ++){ ele = (Element) list.item(i); person = new Person(); person.id = Integer.parseInt(ele.getAttribute("id")); person.name = getSubElementTextContent(ele,"name"); person.age = Integer.parseInt(getSubElementTextContent(ele,"age")); persons.add(person); } } catch (Exception e) { e.printStackTrace(); } return persons; } /** * 得到指定的资源中中间的文本内容 */ private String getSubElementTextContent(Element ele, String tagName) { NodeList list = ele.getElementsByTagName(tagName); Element e = (Element) list.item(0); //得到中间的文本节点 return e.getTextContent(); } }
3.pull方式
/** * pull解析,拉模式,可以手动控制下一个事件是否触发. */ public class PullParse{ public List<Person> doParse(InputStream is) { List<Person> persons = null ; Person person = null ; try { XmlPullParser parser = Xml.newPullParser(); //设置解析数据源 parser.setInput(is, "utf-8"); //取得事件的类型 int eventType = parser.getEventType(); String eleName = null ; while(eventType != XmlPullParser.END_DOCUMENT){ switch(eventType){ //文档开始 case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Person>(); break ; //元素开始 case XmlPullParser.START_TAG: eleName = parser.getName(); if("person".equals(eleName)){ person = new Person(); person.id = Integer.parseInt(parser.getAttributeValue(0)); } else if("name".equals(eleName)){ person.name = parser.nextText(); } else if("age".equals(eleName)){ person.age = Integer.parseInt(parser.nextText()); } break ; //标记结束 case XmlPullParser.END_TAG: eleName = parser.getName(); if("person".equals(eleName)){ persons.add(person); } break ; } //手动激活下个事件的触发 eventType = parser.next(); } } catch (Exception e) { e.printStackTrace(); } return persons; } }
移动开发qq群:59516399
csdn下载链接:http://download.csdn.net/detail/wenwei19861106/4975192