Android下解析xml的三种方式在Android平台上可以使用SimpleAPIforXML(SAX)、DocumentObjectModel(DOM)和Android附带的pull解析器解析XML文件。下面是本例子要解析的XML文件:itcast.xml01?xmlversion=1.0encoding=UTF-8?02persons03personid=2304name李明/name05age30/age06/person07personid=2008name李向梅/name09age25/age10/person11/persons例子定义了一个javabean用于存放上面解析出来的xml内容,这个javabean为Person,代码:01publicclassPerson{0203privateIntegerid;04privateStringname;05privateShortage;0607publicIntegergetId(){08returnid;09}1011publicvoidsetId(Integerid){12this.id=id;13}1415publicStringgetName(){16returnname;17}1819publicvoidsetName(Stringname){20this.name=name;21}2223publicShortgetAge(){24returnage;25}2627publicvoidsetAge(Shortage){28this.age=age;29}30}1.SAX解析XML文件SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。01publicstaticListPersonreadXML(InputStreaminStream){02try{03//创建解析器04SAXParserFactoryspf=SAXParserFactory.newInstance();05SAXParsersaxParser=spf.newSAXParser();0607//设置解析器的相关特性,true表示开启命名空间特性08saxParser.setProperty();09XMLContentHandlerhandler=newXMLContentHandler();10saxParser.parse(inStream,handler);11inStream.close();1213returnhandler.getPersons();14}catch(Exceptione){15e.printStackTrace();16}1718returnnull;19}202122//SAX类:DefaultHandler,它实现了ContentHandler接口。在实现的时候,只需要继承该类,重载相应的方法即可。23publicclassXMLContentHandlerextendsDefaultHandler{2425privateListPersonpersons=null;26privatePersoncurrentPerson;27privateStringtagName=null;//当前解析的元素标签2829publicListPersongetPersons(){30returnpersons;31}3233//接收文档开始的通知。当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。34@Override35publicvoidstartDocument()throwsSAXException{36persons=newArrayListPerson();37}3839//接收元素开始的通知。当读到一个开始标签的时候,会触发这个方法。其中namespaceURI表示元素的命名空间;40//localName表示元素的本地名称(不带前缀);qName表示元素的限定名(带前缀);atts表示元素的属性集合41@Override42publicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts)throwsSAXException{4344if(localName.equals(person)){45currentPerson=newPerson();46currentPerson.setId(Integer.parseInt(atts.getValue(id)));47}4849this.tagName=localName;50}5152//接收字符数据的通知。该方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,53//后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用newString(ch,start,length)就可以获取内容。54@Override55publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{5657if(tagName!=null){58Stringdata=newString(ch,start,length);59if(tagName.equals(name)){60this.currentPerson.setName(data);61}elseif(tagName.equals(age)){62this.currentPerson.setAge(Short.parseShort(data));63}64}65}6667//接收文档的结尾的通知。在遇到结束标签的时候,调用这个方法。其中,uri表示元素的命名空间;68//localName表示元素的本地名称(不带前缀);name表示元素的限定名(带前缀)69@Override70publicvoidendElement(Stringuri,StringlocalName,Stringname)throwsSAXException{7172if(localName.equals(person)){73persons.add(currentPerson);74currentPerson=null;75}7677this.tagName=null;78}79}2.DOM解析XML文件DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOMAPI遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。01publicstaticListPersonreadXML(InputStreaminStream){0203ListPersonpersons=newArrayListPerson();0405DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();0607try{08DocumentBuilderbuilder=factory.newDocumentBuilder();09Documentdom=builder.parse(inStream);1011Elementroot=dom.getDocumentElement();1213NodeListitems=root.getElementsByTagName(person);//查找所有person节点1415for(inti=0;iitems.getLength();i++){16Personperson=newPerson();1718//得到第一个person节点19ElementpersonNode=(Element)items.item(i);2021//获取person节点的id属性值22person.setId(newInteger(personNode.getAttribute(id)));2324//获取person节点下的所有子节点(标签之间的空白节点和name/age元素)25NodeListchildsNodes=personNode.getChildNodes();2627for(intj=0;jchildsNodes.getLength();j++){28Nodenode=(Node)childsNodes.item(j);//判断是否为元素类型2930if(node.getNodeType()==Node.ELEMENT_NODE){31ElementchildNode=(Element)node;3233//判断是否name元素34if(name.equals(childNode.getNodeName())){35//获取name元素下Text节点,然后从Text节点获取数据36person.setName(childNode.getFirstChild().getNodeValue());}elseif(“age”.equals(childNode.getNodeName())){37person.setAge(newShort(childNode.getFirstChild().getNodeValue()));38}39}40}4142persons.add(person);43}4445inStream.close();46}catch(Exceptione){47e.printStackTrace();48}4950returnpersons;51}3.Pull解析器解析XML文件Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。001//读取XML002publicstaticListPersonreadXML(InputStreaminStream){003004XmlPullParserparser=Xml.newPullParser();005006try{007parser.setInput(inStream,UTF-8);008inteventType=parser.getEventType();009010PersoncurrentPerson=null;011ListPersonpersons=null;012013while(eventType!=XmlPullParser.END_DOCUMENT){014switch(eventType){015caseXmlPullParser.START_DOCUMENT://文档开始事件,可以进行数据初始化处理016persons=newArrayListPerson();017break;018019ca