解析xml
xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zking.parsexml">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.
SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
DOM,即对象文档模型,它是将整个XML文档载入内存(所以效率较低,不推荐使用),每一个节点当做一个对象
直接上代码:(三种解析方法写在一起)
package com.example.mylove;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class parseXMLActivity extends AppCompatActivity {
private String cuurentTag=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parsexml);
}
public void parseXML(View view){
new MyTask().execute();
}
//线程间通信机制
//子线程+Handler
//异步任务类 AsyncTask
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
//01.获取网络XML数据
//原生态底层:
//URLConnection
try {
URL url=new URL("http://192.168.43.234:8080/abc.xml");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式‘
connection.setRequestMethod("GET");
//设置请求连接超时的时间(优化)
connection.setConnectTimeout(5000);
//获取结果码
int code=connection.getResponseCode();
if(code==200){
//获取服务器返回过来的结果
InputStream is=connection.getInputStream();
//打印(读)--》测试
// BufferedReader br=new BufferedReader(new InputStreamReader(is));
// String str=null;
// while((str=br.readLine())!=null){
// Log.i("test",str);
// }
//解析XML
//01.使用DOM解析
// DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
// DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
// Document document=documentBuilder.parse(is);
// //获取跟标签
// Element root=document.getDocumentElement();
// Log.i("test","跟标签:"+root.getNodeName());
//
// //获取<persons>下面的所有的子标签<person>
// NodeList nodeList=root.getElementsByTagName("person");
// for (int i = 0; i <nodeList.getLength() ; i++) {
// //获取单个
// //Node
// //Element
// Element personElement= (Element) nodeList.item(i);
// //获取<person>属性id的值
// String id=personElement.getAttribute("id");
// Log.i("test",id);
//
// //获取<person>下面的子标签<name><age><image>的值
// Element nameElement= (Element) personElement.getElementsByTagName("name").item(0);
// String name=nameElement.getTextContent();
// Element ageElement= (Element) personElement.getElementsByTagName("age").item(0);
// String age=ageElement.getTextContent();
// Element imageElement= (Element) personElement.getElementsByTagName("image").item(0);
// String image=imageElement.getTextContent();
//
// Log.i("test",name+" "+age+" "+image);
// }
//02.SAX(边读边解析,基于事件(方法)驱动方式)
// SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
// SAXParser saxParser=saxParserFactory.newSAXParser();
//
// saxParser.parse(is,new DefaultHandler(){
// @Override
// public void startDocument() throws SAXException {
// super.startDocument();
// }
//
// @Override
// public void endDocument() throws SAXException {
// super.endDocument();
// }
//
// @Override
// public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// super.startElement(uri, localName, qName, attributes);
// cuurentTag=localName;
// //获取开始标签的名字
// if("person".equals(localName)){
// //取属性的值
// String id=attributes.getValue(0);
// Log.i("test",id);
// }
//
//
// }
//
// @Override
// public void endElement(String uri, String localName, String qName) throws SAXException {
// super.endElement(uri, localName, qName);
// cuurentTag=null;
// }
//
// @Override
// public void characters(char[] ch, int start, int length) throws SAXException {
// super.characters(ch, start, length);
// if("name".equals(cuurentTag)){
// //获取<name>的值
// String name=new String(ch,start,length);
// Log.i("test", " "+name);
// }else if("age".equals(cuurentTag)){
// //获取<name>的值
// String age=new String(ch,start,length);
// Log.i("test", " "+age);
// }else if("image".equals(cuurentTag)){
// //获取<name>的值
// String image=new String(ch,start,length);
// Log.i("test", " "+image);
// }
// }
// });
//03.使用PULL解析(类似SAX)
XmlPullParser xmlPullParser=Xml.newPullParser();
xmlPullParser.setInput(is,"UTF-8");
//获取解析的标签的类型
int type=xmlPullParser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//获取开始标签名字
String starttagName=xmlPullParser.getName();
if("uses-permission".equals(starttagName)){
//获取id的值
String id=xmlPullParser.getAttributeValue(0);
Log.i("test",id);
}else if("application".equals(starttagName)){
String name=xmlPullParser.getAttributeValue(0);
Log.i("test",name);
}
break;
case XmlPullParser.END_TAG:
break;
}
//细节:
type=xmlPullParser.next();
}
}
//结果码(状态)
//成功:200
//
//未修改:304
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
// catch (ParserConfigurationException e) {
// e.printStackTrace();
// } catch (SAXException e) {
// e.printStackTrace();
// }
// catch (ParserConfigurationException e) {
// e.printStackTrace();
// } catch (SAXException e) {
// e.printStackTrace();
// }
//02.解析XML
//03.展示
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
//展示
}
}
}
解析json
一、什么是JSON?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。JSON就是一串字符串 只不过元素会使用特定的符号标注。
{} 双括号表示对象
[] 中括号表示数组
"" 双引号内是属性或值
: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象
而[{"name": "Michael"},{"name": "Jerry"}]就表示包含两个对象的数组
当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有一个name数组的对象
首先我们看一下json格式的数据
{
"list":2,
"persons":[{"pid":1,"pname":"张三","page":10},{"pid":2,"pname":"黄三","page":18}]
}
今天楼主给大家讲三种解析方法
1 原生态 (JSONObject+JSONArray)
JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object
JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
2 Gson (谷歌提供)
3 FastJson (阿里巴巴提供)
看代码吧:
package com.example.blue;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.alibaba.fastjson.JSON;
import com.example.entity.BigPerson;
import com.example.entity.SmallPerson;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
public class parseJsonActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parsejson);
}
public void parseJson(View view){
//01.获取网络Json
new MyTask().execute();
}
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
try {
URL url=new URL(getString(R.string.server_name)+"abc.json");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式‘
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
//获取结果码
int code=connection.getResponseCode();
if(code==200){
InputStream is=connection.getInputStream();
//测试
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=null;
StringBuffer stringBuffer=new StringBuffer();
while((str=br.readLine())!=null){
stringBuffer.append(str);
}
Log.i("test",stringBuffer.toString());
//02.开始解析Json
//01.使用原生态
// JSONObject jsonObject=new JSONObject(stringBuffer.toString());
// int list=jsonObject.getInt("list");
// Log.i("test","长度:"+list);
//
// JSONArray jsonArray=jsonObject.getJSONArray("persons");
//
// for (int i = 0; i <jsonArray.length() ; i++) {
// JSONObject object=jsonArray.getJSONObject(i);
// int pid=object.getInt("pid");
// String pname=object.getString("pname");
// int page=object.getInt("page");
// Log.i("test",pid+" "+pname+" "+page);
// }
//02.使用Gson解析json
Gson gson=new Gson();
BigPerson bigPerson=gson.fromJson(stringBuffer.toString(),BigPerson.class);
Log.i("test",bigPerson.getList()+"");
List<SmallPerson> persons=bigPerson.getPersons();
for (SmallPerson person : persons) {
Log.i("test",person.toString());
}
//03.FastJson
// BigPerson bigPerson=JSON.parseObject(stringBuffer.toString(),BigPerson.class);
// Log.i("test",bigPerson.getList()+"");
// List<SmallPerson> persons=bigPerson.getPersons();
// for (SmallPerson person : persons) {
// Log.i("test",person.toString());
// }
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// catch (JSONException e) {
// e.printStackTrace();
// }
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
}
}
}
用到第二种和第三种方式解析时我们要用到json中所对应的实体
package com.example.entity;
import java.util.List;
public class BigPerson {
private int list;
private List<SmallPerson> persons;
public BigPerson() {
}
public BigPerson(int list, List<SmallPerson> persons) {
this.list = list;
this.persons = persons;
}
public int getList() {
return list;
}
public void setList(int list) {
this.list = list;
}
public List<SmallPerson> getPersons() {
return persons;
}
public void setPersons(List<SmallPerson> persons) {
this.persons = persons;
}
}
package com.example.entity;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by Administrator on 2017/02/16 0016.
*/
public class SmallPerson implements Parcelable {
private int pid;
private String pname;
private int page;
public SmallPerson() {
}
public SmallPerson(int page, int pid, String pname) {
this.page = page;
this.pid = pid;
this.pname = pname;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(pid);
parcel.writeString(pname);
parcel.writeInt(page);
}
public static final Parcelable.Creator<SmallPerson> CREATOR = new Parcelable.Creator<SmallPerson>() {
@Override
public SmallPerson createFromParcel(Parcel parcel) {
SmallPerson smallPerson = new SmallPerson();
smallPerson.setPid(parcel.readInt());
smallPerson.setPname(parcel.readString());
smallPerson.setPage(parcel.readInt());
return null;
}
@Override
public SmallPerson[] newArray(int i) {
return new SmallPerson[i];
}
};
@Override
public String toString() {
return "SmallPerson{" +
"pid=" + pid +
", pname='" + pname + '\'' +
", page=" + page +
'}';
}
}
看到这里差不多就结束了,亲 给个赞呗