Android学习笔记--XML文件解析
MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.什么是SAX SimpleAPIforXML,既是指一种接口,也是指一个软件包 作为接口,SAX是事件驱动型XML解析的一个标准接口 2.SAX基本原理 SAX的哦给你工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素(element)开始与结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束. 大多数SAX实现都会产生一下类型的事件 { 在文档的开始和结束时出发文档处理事件 在文档内每一XML元素接受解析的前后触发元素事件 任何元数据通常都由氮素的事件交付 在处理文档的DTD或Schema时产生DTD或Schema事件 产生错误事件用来通知主机应用程序解析错误 } 3.SAX常用接口 ContentHandler接口 ContentHandler是java类包中一个特殊的SAX接口,位于org.xml.sax包中.该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束,元素的开头和结束,以及元素中的字符数据等事件.当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件 ContnetHandler接口的方法有以下几种 { VoidstartDocument(); VoidendDocument(); VoidstartElement(Stringuri,StringlocalName,stringqName,Attributesatts) VoidendElement(Stringuri,StringlocalName,StringqName) Voidcharacters(char[]ch,intstart,intlength) } 4.SAX解析 解析文档过程 例:<doc> <para>HelloWorld!</para> </doc> 在解析文档的过程中会产生如下一系列事件 Startdocument { Startelement:doc A:创建事件处理程序 Startelement:para Characters:HelloWorld! B:创建SAX解析器 Endelement:para Endelement:doc C:将事件处理程序分配给解析器 D:对文档进行解析,将每个事件发送给处理程序 Enddocument } 解析样例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 PublicvoidonClick(Viewv){ HttpDownloaderhd=newHttpDownloader(); StringresultStr=hd.download("XMLURL"); System.out.priintln(resultStr); Try { //创建一个SAXParseFactory SAXParserFactoryfactory=SAXParserFactory.newInstance(); XMLReaderreader=factory.newSAXParser().getXMLReader(); //为XMLReader设置内容处理器MyContentHandler reader.setContentHandler(newMyContenHandler()); //开始解析文件字符串构造成reader之后构造成inputSource Reader.parse(newInputSource(newStringReader(resultStr))); }catch(Execptione){ e.printStackTrace(); } } XML文件写法: <wordkers> <workerid="AQ01"> <name>mark</name> <sex>male</sex> <status>manager</status> <address>NewYork</address> <salary>$4000</salary> <workerid="AQ02"> <name>lily</name> <sex>female</sex> <status>assists</status> <address>H</address> <salary>$2000</salary> <workerid="AQ03"> <name>tom</name> <sex>male</sex> <status>manager</status> <address>F</address> <salary>$5000</salary> </wordkers> MyContenHandler的写法例: PublicclassMyContenHandlerExtendsDefaultHandler{//此处体现了适配器模式 StringName,Sex,Status,Address,Salary StringtagName; //开始document PublicvoidstartDocument()throwsSAXExecption{ System.out.println("-------begin--------"); } //结束document PublicvoidendDocument()throwsSAXExecption{ System.out.println("-------end--------"); } //开始节点对象 PublicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesattr)throwsSAXExecption{ tagName=localName; If(localName.equals("worker")){ //获取标签的全部属性 For(inti=0;i<attr.getLength();i++){ System.out.println(attr.getLocalName(i)+"="+attr.getValue(i)) } } } //结束节点对象 PublicvoidendElement(StringnamespaceURI,StringlocalName,StringqName)throwsSAXExecption{ //在一个标签解析完之后,打印所有标签的信息 If(localNmae.equals("worder")){ This.printout(); } } //读取文本对象 Publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXExecption{ If(tagNmae.equals("name")) Hisname=newString(ch,start,length); Elseif(tagNmae.equals("sex")) Sex=newString(ch,start,length); Elseif(tagNmae.equals("status")) Status=newString(ch,start,length); Elseif(tagNmae.equals("address")) Address=newString(ch,start,length); Elseif(tagNmae.equals("salary")) Salary=newString(ch,start,length); } //打印读出的信息 Publicvoidprintout(){ System.out.println("name--->"+Name); System.out.println("name--->"+Sex); System.out.println("name--->"+Status); System.out.println("name--->"+Address); System.out.println("name--->"+Salary); } } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360566,如需转载请自行联系原作者