XML文件和JSON文件的解析及生成

      在Android中最常见的两种数据格式就是XML和JSON,这方面也有很多好的解析框架,如果有兴趣不可网上找找。当然对于一个开发者而言,不仅仅是只会使用这些框架,而应该还要了解基本实现原理。今天主要是来讲讲XML文件和JSON文件的解析及生成。

###XML(可扩展标记语言)的序列化与解析
XML的序列化:

  1. 使用XML类的newSerializer()静态方法得到一个XmlSerializer对象。
  2. 接着使用XmlSerializer对象的setOutput()为XmlSerializer对象设置一个输出流。
  3. 然后就可以使用具体的startDocument开始文档,endDocument结束文档,startTag开始元素,endTag结束元素,attribute设置元素属性,text添加文本等方法来创建具体的XML文档内容。

####XML文件的三中解析:
Pull解析: 在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们可以调用它的getEventType()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值,通过next()方法下移指针。
      XmlPullParser对象的获取:使用XML类的newPullParser()静态方法得到一个XmlPullParser对象,接着使用XmlPullParser对象的setInput()为XmlPullParser对象设置一个输入流
XmlPullParser类常用的方法与静态字段

方法或静态字段说明
setInput(InputStream inputStream,String inputEncoding)设置输入流及编码格式
setInput(InputStream inputStream,String inputEncoding)设置输入流及编码格式
getEventType()得到当前指针所在位置的解析事件
XmlPullParser.END_DOCUMENT结束文档解析事件
XmlPullParser.START_DOCUMENT开始文档解析事件
XmlPullParser.START_TAG开始标签解析事件
XmlPullParser.END_TAG结束标签解析事件
nextText()获取本节点的值
getAttributte()本节点属性的值
parser.next()指针下移

SAX解析:这种方式解析是一种基于事件驱动的api,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源),事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。SAX是事件驱动型XML解析的一个标准接口,不会改变SAX的工作原理,简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束
下面是ContentHandler接口的常用方法
      public abstract void characters (char[] ch, int start, int length)
      这个方法来接收字符块通知,解析器通过这个方法来报告字符数据块,解析器为了提高解析效率把读到的所有字符串放到一个字符数组(ch)中,作为参数传递给character的方法中,如果想获取本次事件中读取到的字符数据,需要使用start和length属性。
      public abstract void startDocument () 接收文档开始的通知
      public abstract void endDocument () 接收文档结束的通知
      public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文档开始的标签
      public abstract void endElement (String uri, String localName, String qName) 接收文档结束的标签
      在一般使用中为了简化开发,在org.xml.sax.helpers提供了一个DefaultHandler类,它实现了ContentHandler的方法,我们只想继承DefaultHandler方法即可。
      另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。

步骤:

  1. 实例化一个工厂SAXParserFactory
  2. 实例化SAXPraser对象,创建XMLReader 解析器
  3. 实例化handler,处理器
  4. 解析器注册一个事件
  5. 读取文件流
  6. 解析文件

DOM解析:将XML文件看成一DOM棵树,它是将整个XML文档载入内存(所以效率较低,不推荐使用),每一个节点当做一个对象
步骤:

  1. 调用 DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工厂类实例。
  2. 调用解析器工厂实例类的 newDocumentBuilder() 方法得到 DOM 解析器对象
  3. 调用 DOM 解析器对象的 parse() 方法解析 XML 文档得到代表整个文档的 Document 对象。

###JSON文件的解析及生成
JSONArray类(org.json.JSONArray)和JSONObject类:

方法说明
JSONArray()无参构造方法
JSONArray(String JSONString)有参构造方法,参数为JSON字符串
Object get(int index)根据下标得到相应的对象
JSONArray getJSONArray(int index)根据下标得到JSON数组
JJSONObject getJSONObject(int index)根据下标得到JSON对象
String getString(int index)根据下标得到String对象
xx getxx(int index)根据下标得到xx对象,xx代表一种数据类型
JSONArray put(int index, xx value)向JSONArray对象添加数据,xx代表一种数据类型
JSONArray put( xx value)向JSONArray对象添加数据,xx代表一种数据类型
boolean isNull(String name)根据名字段判断该字段是否为空

对于输入流为JSON数据:
先将输入转化为字节数组,再将字节数组转化为JSONArray或JSONObject对象,再通过get方法得到相应的数据。
将数据转化为JSON数据输出:
先将数据转化为JSONArray或JSONObject对象,再将对象以输出流的方法输出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值