在网络上传输数据时最常用的格式有两种:XML和JSON。本文主要就是学习如何对这两种常用的数据格式进行解析。
1 <apps>
2 <app>
3 <id>1</id>
4 <name>matlab</name>
5 <version>12.5</version>
6 </app>
7 <app>
8 <id>2</id>
9 <name>chorme</name>
10 <version>9.986</version>
11 </app>
12 <app>
13 <id>3</id>
14 <name>Google Maps</name>
15 <version>10.4</version>
16 </app>
17 </apps>
1 [{"id":"1","name":"matlab","version","12.5"}
2 {"id":"2","name":"chorme","version","9.986"}
3 {"id":"3","name":"Google Maps","version","10.4"}]
我们先整体上列一个思路,对于这两种数据格式的解析,每一种数据都有多种解析方法,本文对每一种数据都提供两种经常用到的两种方式:
1 private void parseXMLWithPull(String xmlData){
2 try {
3 //创建一个xml解析的工厂
4 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
5 //获得xml解析类的引用
6 XmlPullParser xmlPullParser = factory.newPullParser();
7 //以流的方式传入需要解析的xml数据
8 xmlPullParser.setInput(new StringReader(xmlData));
9 //获得事件的类型
10 int eventType = xmlPullParser.getEventType();
11 String id = "" ;
12 String name = "" ;
13 String version = "" ;
14 //判断是否到了文档结束位置
15 while(eventType != XmlPullParser.END_DOCUMENT){
16 String nodeName = xmlPullParser.getName() ;
17 switch(eventType){
18
19 //遇到标签元素
20 case XmlPullParser.START_TAG:
21 if("id".equals(nodeName)){
22 //取出属性值,0是代表第0个属性
23 id = xmlPullParser.nextText();
24 } else if("name".equals(nodeName)){
25 //获取该节点的内容
26 name = xmlPullParser.nextText();
27 }else if("version".equals(nodeName)){
28 //获取该节点的内容
29 version = xmlPullParser.nextText();
30 }
31 break;
32 //标签结束
33 case XmlPullParser.END_TAG:
34 if("app".equals(xmlPullParser.getName())){
35 //这里可以做一些初始化,或者log记录
36 Log.d("MainAvtivity", "id is" + id) ;
37 Log.d("MainAvtivity", "name is" + name) ;
38 Log.d("MainAvtivity", "version is" + version) ;
39 }
40 break;
41 default:
42 break ;
43 }
44 //循环
45 eventType = xmlPullParser.next();
46 }
47 } catch (Exception e) {
48 // TODO Auto-generated catch block
49 e.printStackTrace();
50 }
51 }
1 private void parseXMLWithSAX(String xmlData){
2 try {
3 //第一步:新建一个工厂类SAXParserFactory,并获取其实例
4 SAXParserFactory factory = SAXParserFactory.newInstance();
5 //第二步:让工厂类产生一个SAX的解析类SAXParser的对象
6 SAXParser parser = factory.newSAXParser();
7 //第三步:从SAXPsrser中得到一个XMLReader实例
8 XMLReader xmlReader = parser.getXMLReader();
9 //第四步:把自己写的handler注册到XMLReader中,一般最重要的就是ContentHandler
10 MySaxHandler handler = new MySaxHandler() ;
11 xmlReader.setContentHandler(handler);
12 //第五步:将一个xml文档或者资源变成一个java可以处理的InputStream流后,解析正式开始
13 xmlReader.parse(new InputSource(new StringReader(xmlData)));
14 } catch (Exception e) {
15 // TODO Auto-generated catch block
16 e.printStackTrace();
17 }
18 }
最重要、最关键的就是第四步,handler的实现。下面是其实现的代码:
1 /*
2 * 实现一个ContentHandler一般要一下几个步骤:
3 *
4 * 1、声明一个类,继承DefaultHandler。DefaultHandler是一个基类,这个类里面简单实现了
5 * 一个ContentHandler。我们只需要重写里面的方法即可。
6 * 2、重写 startDocument() 和 endDocument(),一般解析将正式解析之前的一些初始化工资放
7 * 到startDocument()里面,收尾的工作放到endDocument()里面。
8 * 3、重写startElement(),XML解析器遇到XML里面的tag时就会调用这个函数。经常在这个函数内是
9 * 通过localName俩进行判断而操作一些数据。
10 * 4、重写characters()方法,这是一个回调方法。解析器执行完startElement()后,解析完节点的内
11 * 容后就会执行这个方法,并且参数ch[]就是节点的内容。这个例子里我们根据currentstate的不同,来
12 * 判断当前那个tag的内容,并放到合适的实体类中。
13 * 5、重写endElement()方法,这个方法与startElement()相对应,解析完一个tag节点后,执行这个方法。
14 * 再找个例子中,如果解析一个item结束,就将RSSIiem添加到RSSFeed中。
15 *
16 */
17 class MySaxHandler extends DefaultHandler{
18
19 private String nodeName ;
20 private StringBuilder id ;
21 private StringBuilder name ;
22 private StringBuilder version ;
23
24 /**
25 * 当SAX解析器解析到XML文档开始时,会调用的方法
26 */
27 @Override
28 public void startDocument() throws SAXException {
29 id = new StringBuilder() ;
30 name = new StringBuilder() ;
31 version = new StringBuilder() ;
32 }
33
34 /**
35 * 当SAX解析器解析到XML文档结束时,会调用的方法
36 */
37 @Override
38 public void endDocument() throws SAXException {
39 super.endDocument();
40 }
41
42 /**
43 * 当SAX解析器解析到某个属性值时,会调用的方法
44 * 其中参数ch记录了这个属性值的内容
45 */
46 @Override
47 public void characters(char[] ch, int start, int length)throws SAXException {
48 //根据当前的节点名判断将内容添加到哪一个StringBuilder上
49 if("id".equals(nodeName)){
50 id.append(ch, start, length) ;
51 }else if("name".equals(nodeName)){
52 name.append(ch, start, length) ;
53 }else if("version".equals(nodeName)){
54 version.append(ch, start, length) ;
55 }
56 }
57
58 /**
59 * 当SAX解析器解析到某个元素开始时,会调用的方法
60 * 其中localName记录的是元素属性名
61 */
62 @Override
63 public void startElement(String uri, String localName, String qName,
64 Attributes attributes) throws SAXException {
65 nodeName = localName ;
66 }
67
68 /**
69 * 当SAX解析器解析到某个元素结束时,会调用的方法
70 * 其中localName记录的是元素属性名
71 */
72 @Override
73 public void endElement(String uri, String localName, String qName)
74 throws SAXException {
75 if("app".equals(localName)){
76 //这里可以做一些初始化,或者log记录
77 Log.d("MainAvtivity", "id is" + id) ;
78 Log.d("MainAvtivity", "name is" + name) ;
79 Log.d("MainAvtivity", "version is" + version) ;
80 }
81 }
82 }
1 private void parseJSONWithJSONObject(String jsonData){
2 try {
3 JSONArray jsonArray = new JSONArray(jsonData);
4 for (int i = 0; i < jsonArray.length(); i++) {
5 JSONObject jsonObject = jsonArray.getJSONObject(i);
6 String id = jsonObject.getString("id");
7 String name = jsonObject.getString("name");
8 String version = jsonObject.getString("version");
9
10 // 解析完之后对这些数据进行处理,这里我们只是Log输出
11 Log.d("MainAvtivity", "id is" + id);
12 Log.d("MainAvtivity", "name is" + name);
13 Log.d("MainAvtivity", "version is" + version);
14 }
15 } catch (Exception e) {
16 e.printStackTrace();
17 }
18 }
1 private void parseJSONWithGson(String jsonData){
2 Gson gson= new Gson() ;
3 //我们借助TypeTolen将期望解析成的数据类型传入到fromJson()方法中
4 List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>(){}.getType()) ;
5 for(App app:appList){
6 // 解析完之后对这些数据进行处理,这里我们只是Log输出
7 Log.d("MainAvtivity", "id is" + app.getId());
8 Log.d("MainAvtivity", "name is" +app.getName());
9 Log.d("MainAvtivity", "version is" + app.getVersion());
10 }
11 }
1 /*
2 * 我们将一个JSON对象({}之间表示一个对象)封装成App类
3 */
4 class App{
5 String id ;
6 String name ;
7 String version ;
8 public String getId() {
9 return id;
10 }
11 public void setId(String id) {
12 this.id = id;
13 }
14 public String getName() {
15 return name;
16 }
17 public void setName(String name) {
18 this.name = name;
19 }
20 public String getVersion() {
21 return version;
22 }
23 public void setVersion(String version) {
24 this.version = version;
25 }
26 }
FastJSON:不详细解释。