|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
iOS5开始支持CoreImage了还没去看Mac上的CI是很强大的CFNetwork---从来没用过我一般都会用ASIHttpRequset封装好的高层网络库OBJC实现的CFNetwork好像是C实现CoreLocation---获取位置的库工具很少在Android平台上可使用SimpleAPIforXML(SAX)、DocumentObjectModel(DOM)和Android附带的pull剖析器剖析XML文件。上面是本例子要剖析的XML文件:
文件称号:itcast.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<persons>
<personid="23">
<name>liming</name>
<age>30</age>
</person>
<personid="20">
<name>lixiangmei</name>
<age>25</age>
</person>
</persons>
例子界说了一个javabean用于寄存下面剖析出来的xml内容,这个javabean为Person。javaBean在MVC计划模子中是model,又称模子层,在一样平常的程序中,我们称它为数据层,就是用来设置数据的属性和一些举动,然后我会供应猎取属性和设置属性的get/set办法
SAX是一个剖析速率快而且占用内存少的xml剖析器,十分合适用于Android等挪动设备。SAX剖析XML文件接纳的是事务驱动,也就是说,它其实不必要剖析完全个文档,在按内容按次剖析文档的过程当中,SAX会判别以后读到的字符是不是正当XML语法中的某部分,假如切合就会触发事务。所谓事务,实在就是一些回调(callback)办法,这些办法(事务)界说在ContentHandler接口。上面是一些ContentHandler接口经常使用的办法:
startDocument()
当碰到文档的开首的时分,挪用这个办法,能够在个中做一些预处置的事情。
endDocument()
和下面的办法绝对应,当文档停止的时分,挪用这个办法,能够在个中做一些善后的事情。
startElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts)
当读到一个入手下手标签的时分,会触发这个办法。namespaceURI就是定名空间,localName是不带定名空间前缀的标署名,qName是带定名空间前缀的标署名。经由过程atts能够失掉一切的属性名和响应的值。要注重的是SAX中一个主要的特性就是它的流式处置,当碰到一个标签的时分,它其实不会记录下之前所碰着的标签,也就是说,在startElement()办法中,一切你所晓得的信息,就是标签的名字和属性,至于标签的嵌套布局,下层标签的名字,是不是有子元属等等别的与布局相干的信息,都是不得而知的,都必要你的程序来完成。这使得SAX在编程处置上没有DOM来得那末便利。
endElement(Stringuri,StringlocalName,Stringname)
这个办法和下面的办法绝对应,在碰到停止标签的时分,挪用这个办法。
characters(char[]ch,intstart,intlength)
这个办法用来处置在XML文件中读到的内容,第一个参数为文件的字符串内容,前面两个参数是读到的字符串在这个数组中的肇端地位和长度,利用newString(ch,start,length)就能够猎取内容。
只需为SAX供应完成ContentHandler接口的类,那末该类就能够失掉关照事务(实践上就是SAX挪用了该类中的回调办法)。由于ContentHandler是一个接口,在利用的时分大概会有些不便利,因而,SAX还为其制订了一个Helper类:DefaultHandler,它完成了ContentHandler接口,可是其一切的办法体都为空,在完成的时分,你只必要承继这个类,然后重写响应的办法便可。
上面来看详细的实例:
起首建一个itcast.xml文件在src目次下,然后新建一个cn.itcast.domain包,在包下新建一个person类,次要用于寄存下面剖析出来的xml内容,javaBean在MVC计划模子中是model,又称模子层,在一样平常的程序中,我们称它为数据层,就是用来设置数据的属性和一些举动,然后我会供应猎取属性和设置属性的get/set办法
详细代码以下:
<br>
<br>ViewCode- 1packagecn.itcast.domain;23publicclassPerson{4privateIntegerid;5privateStringname;6privateShortage;78publicPerson(){}910publicPerson(Integerid,Stringname,Shortage){11this.id=id;12this.name=name;13this.age=age;14}1516publicIntegergetId(){17returnid;18}19publicvoidsetId(Integerid){20this.id=id;21}22publicStringgetName(){23returnname;24}25publicvoidsetName(Stringname){26this.name=name;27}28publicShortgetAge(){29returnage;30}31publicvoidsetAge(Shortage){32this.age=age;33}34@Override35publicStringtoString(){36return"Person[age="+age+",id="+id+",name="+name+"]";37}3839}
复制代码 第二步:新建一个packagecn.itcast.service包,在包下新建一个SAXPersonService类,这个就是MVC里的M,营业类,次要代码以下
ViewCode- 1packagecn.itcast.service;23importjava.io.InputStream;4importjava.util.ArrayList;5importjava.util.List;6importjavax.xml.parsers.SAXParser;7importjavax.xml.parsers.SAXParserFactory;8importorg.xml.sax.Attributes;9importorg.xml.sax.SAXException;10importorg.xml.sax.helpers.DefaultHandler;1112importcn.itcast.domain.Person;13/**14*接纳SAX剖析XML内容15*/16publicclassSAXPersonService{1718publicList<Person>getPersons(InputStreaminStream)throwsThrowable{19//失掉一个Sax剖析器工场20SAXParserFactoryfactory=SAXParserFactory.newInstance();21//失掉剖析器22SAXParserparser=factory.newSAXParser();23//new出一个PersonParser对象出来。把这个对象传到上面语句中24PersonParserpersonParser=newPersonParser();25//对失掉的输出流Sax举行剖析,第一个参数是要举行剖析的xml内容,第二个参数是给SAXDefaultHandler利用(回调函数)26parser.parse(inStream,personParser);27inStream.close();28//前往失掉的getPersons29returnpersonParser.getPersons();30}3132privatefinalclassPersonParserextendsDefaultHandler{33//把剖析到的数据都放到汇合内里往34privateList<Person>persons=null;35//纪录以后所剖析到的元素节点称号36privateStringtag=null;37privatePersonperson=null;38//供应一个getpersons办法,次要是为主程序利用39publicList<Person>getPersons(){40returnpersons;41}4243@Override44publicvoidstartDocument()throwsSAXException{45//初始化46persons=newArrayList<Person>();47}4849@Override50publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{51//判别是否是我们要剖析的元素节点52if("person".equals(localName)){53person=newPerson();//new出person对象,把要剖析的内容传给person的Id属性54person.setId(newInteger(attributes.getValue(0)));55}56//寄存节点称号到成员变量内里57tag=localName;58}5960@Override61publicvoidcharacters(char[]ch,intstart,intlength)62throwsSAXException{63//起首判别节点称号是不是为空,然后在判别节点称号是不是为name64if(tag!=null){65Stringdata=newString(ch,start,length);//猎取文本节点的数据66if("name".equals(tag)){//判别节点称号是不是为name67person.setName(data);//把要剖析的内容传给person的name属性68}elseif("age".equals(tag)){//判别节点称号是不是为age69person.setAge(newShort(data));70}71}72}7374@Override75publicvoidendElement(Stringuri,StringlocalName,StringqName)76throwsSAXException{77if("person".equals(localName)){//当跟小节点为person时78persons.add(person);//把person放到汇合persons内里79person=null;//把以后person设为空80}81//碰到停止元素就把纪录设为空82tag=null;83}84}85}
复制代码 第三步:在主包下新建一个PersonServiceTest类,这个类相称与mvc中的c(把持层),次要是对SAXPersonService这个类举行单位测试
ViewCode- 1publicclassPersonServiceTestextendsAndroidTestCase{2privatestaticfinalStringTAG="PersonServiceTest";34publicvoidtestSAXGetPersons()throwsThrowable{5//new出一个营业对象6SAXPersonServiceservice=newSAXPersonService();7//经由过程类加载器加载要剖析的文件8InputStreaminStream=getClass().getClassLoader().getResourceAsStream("itcast.xml");9List<Person>persons=service.getPersons(inStream);10for(Personperson:persons){11Log.i(TAG,person.toString());12}13}14}
复制代码 AndroidMainFest文件代码,这里次要是用到了单位测试,必要加几句代码
ViewCode- 1<?xmlversion="1.0"encoding="utf-8"?>2<manifestxmlns:android="http://schemas.android.com/apk/res/android"3package="cn.itcast.xml"4android:versionCode="1"5android:versionName="1.0">6<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">7<uses-libraryandroid:name="android.test.runner"/>8<activityandroid:name=".MainActivity"9android:label="@string/app_name">10<intent-filter>11<actionandroid:name="android.intent.action.MAIN"/>12<categoryandroid:name="android.intent.category.LAUNCHER"/>13</intent-filter>14</activity>1516</application>17<uses-sdkandroid:minSdkVersion="8"/>18<instrumentationandroid:name="android.test.InstrumentationTestRunner"19android:targetPackage="cn.itcast.xml"android:label="TestsforMyApp"/>20</manifest>
复制代码 测试了局
<br>
如许,xml剖析就完成了
父类是NSObjectUIKit里最底层的库可以响应一些触摸事件设置焦点等功能UIView父类是UIResponder所有View的父类方法太多了大部分很有用这个不赘述了 |
|