活着的死人 发表于 2015-1-18 11:47:06

IOS编程之android xml剖析之SAX仓酷云

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>ViewCode1packagecn.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";37}3839}第二步:新建一个packagecn.itcast.service包,在包下新建一个SAXPersonService类,这个就是MVC里的M,营业类,次要代码以下
ViewCode1packagecn.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这个类举行单位测试
ViewCode1publicclassPersonServiceTestextendsAndroidTestCase{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文件代码,这里次要是用到了单位测试,必要加几句代码
ViewCode1<?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的父类方法太多了大部分很有用这个不赘述了

因胸联盟 发表于 2015-1-21 14:11:23

这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。

变相怪杰 发表于 2015-1-22 23:41:23

众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。

愤怒的大鸟 发表于 2015-1-25 18:16:57

同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。

乐观 发表于 2015-2-1 10:36:08

从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,

仓酷云 发表于 2015-2-8 12:25:08

自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉

小魔女 发表于 2015-2-25 11:54:22

学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。

不帅 发表于 2015-3-2 00:02:46

其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。

深爱那片海 发表于 2015-3-2 03:48:30

特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地

admin 发表于 2015-3-4 11:28:10

近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,

精灵巫婆 发表于 2015-3-7 22:35:36

自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉

老尸 发表于 2015-3-15 14:51:42

中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,

只想知道 发表于 2015-3-21 21:11:45

其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。

莫相离 发表于 2015-3-22 01:41:30

看完这个你就可以有多种选择来踏入做应用的阶段

飘灵儿 发表于 2015-4-1 17:10:07

首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书

金色的骷髅 发表于 2015-4-3 04:40:57

才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。

若天明 发表于 2015-4-4 09:37:25

其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。

小女巫 发表于 2015-4-16 14:10:36

看《iPhone 4与iPad开发基础教程》,跟着一步步来

透明 发表于 2015-4-26 10:34:44

近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,

再见西城 发表于 2015-5-7 20:17:25

培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
页: [1]
查看完整版本: IOS编程之android xml剖析之SAX仓酷云