/***********2016年5月6日 更新**********************/
知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别?
刘吉财:
主要有dom,sax和pull三种,不过貌似官方推荐使用pull,这个不是很了解,但和sax类似,都是利用事件驱动的,根据不同的标签来处理事件。dom的话是把xml文件用树的形式,在解析过程中将整棵树保存到内存中,效率相对于sax来说比较低。所以建议使用sax啦
/*************************************************/
新建一个天气信息的xml@H_502_28@文件,新建一个业务包,包里面一个业务类,暴露获取天气的方法,新建一个@H_502_28@domain@H_502_28@包,包里面一个天气的业务@H_502_28@bean@H_502_28@,业务@H_502_28@bean@H_502_28@里面根据@H_502_28@xml@H_502_28@的节点建立成员属性,生成@H_502_28@get set@H_502_28@方法,生成有参和无参的构造函数,在业务方法里面解析@H_502_28@xml@H_502_28@文件塞到业务集合里面。@H_502_28@
Javaweb里面解析@H_502_28@xml@H_502_28@,@H_502_28@DOM@H_502_28@解析,一次性加载到内存里面,生成树状的结构,消耗的内存大,@H_502_28@SAX@H_502_28@解析,基于事件的解析,速度快不能倒退,@H_502_28@android@H_502_28@下是@H_502_28@pull@H_502_28@解析,类似@H_502_28@SAX@H_502_28@解析@H_502_28@
获取XmlPullParser@H_502_28@对象,通过@H_502_28@Xml.newPullParser@H_502_28@方法,@H_502_28@
调用XmlPullParser@H_502_28@对象的@H_502_28@setInput(inputSTream,inputEncoding)@H_502_28@,文件输入流,编码@H_502_28@
调用XmlPullParser@H_502_28@对象的@H_502_28@getEventType()@H_502_28@获得事件类型,有@H_502_28@Xml.START_DOCUMENt @H_502_28@,@H_502_28@Xml.END_DOCUMENT@H_502_28@,@H_502_28@Xml.START_TAG@H_502_28@,@H_502_28@Xml.END_TAG@H_502_28@
通过循环不停的取
While(类型不等于@H_502_28@END_DOCUMENT){@H_502_28@
}
在这个循环里面switch@H_502_28@进行判断,当@H_502_28@START_TAG@H_502_28@的时候,调用@H_502_28@XmlPullParser@H_502_28@对象的@H_502_28@getName()@H_502_28@方法获取节点的名称,等于一个值得时候,创建@H_502_28@List@H_502_28@集合,等于一个值得时候创建业务对象,调用@H_502_28@XmlPullParser@H_502_28@对象的@H_502_28@getAttributeValue()@H_502_28@可以获取属性,调用@H_502_28@nextText()@H_502_28@可以获取节点内容,当@H_502_28@END_TAG@H_502_28@的时候业务对象@H_502_28@add@H_502_28@放入集合,@H_502_28@
当Xml@H_502_28@文件在类路径下,可以通过类加载器直接加载@H_502_28@xml@H_502_28@文件,例如 @H_502_28@MainActivity.class.getClassloader().getResourceAsStream(@H_502_28@文件名@H_502_28@)@H_502_28@,为了好看点,可以在业务@H_502_28@bean@H_502_28@里面生成@H_502_28@toString()@H_502_28@方法,可以方便打印查看,@H_502_28@