本文操作结合上篇博文-“网络请求HttpURLConnection与HttpClient的使用”。以Student类为例。
大体上,每次解析分为四个流程:
1,XML或者JSON数据的准备
2,实体类
3,工具类
4,主界面调用
XML数据如下:
<?xml version="1.0" encoding="UTF-8"?>
<class>
<student id="23">
<name>zhang san</name>
<gender>true</gender>
</student>
<student id="2">
<name>li si</name>
<gender>false</gender>
</student>
<student id="41">
<name>wang wu</name>
<gender>true</gender>
</student>
</class>
JSON数据如下:
[
{"id":"5","gender":"true","name":"Angry Birds"},
{"id":"6","gender":"false","name":"Clash of Clans"},
{"id":"7","gender":"true","name":"Hey Day"}
]
Student的实体类
package com.jackie.app_test;
/**
* Created by Administrator on 2016/11/8.
*/
public class Student {
private int id;
private String name;
private boolean gender; //true:男,false:女。
public Student() {
}
public Student(int id, String name, boolean gender) {
this.id = id;
this.name = name;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", gender=" + gender +
'}';
}
}
工具类ParserUtil -本文的核心代码
package com.jackie.app_test;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParserFactory;
/**
* Created by Administrator on 2016/11/8.
*/
public class ParserUtil {
public static List<Student> parserXMLWithDOM(String xmlData) {
List<Student> students = new ArrayList<>();
Student student = null;
try {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(new InputSource(new StringReader(xmlData)));
//通过标签得到要解析元素的节点集
NodeList nodeList = document.getElementsByTagName("student");
for (int i = 0; i < nodeList.getLength(); i++) {
student = new Student();
//得到每个节点,并转化成元素类型
Element element = (Element) nodeList.item(i);
//得到元素节点中的属性值
student.setId(Integer.parseInt(element.getAttribute("id")));
//得到元素节点里面的子节点集
NodeList childNodes = element.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node node = childNodes.item(j);
if (Node.ELEMENT_NODE == node.getNodeType()) {//判断节点类型是否为元素节点。排除文本节点。
Element element1 = (Element) node;
//得到子节点的标签名
String nodeName = element1.getNodeName();
//得到子节点的内容
String content = element1.getTextContent();
if ("name".equals(nodeName)) {
student.setName(content);
} else if ("gender".equals(nodeName)) {
student.setGender(Boolean.parseBoolean(content));
}
}
}
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
}
return students;
}
public static List<Student> parserXMLWithPull(String xmlData) {
List<Student> students = null;
Student student = null;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
for (int eventType = xmlPullParser.getEventType();
(eventType != XmlPullParser.END_DOCUMENT);
eventType = xmlPullParser.next()) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
//开始解析文档
case XmlPullParser.START_DOCUMENT:
students = new ArrayList<>();
break;
//开始解析某个点
case XmlPullParser.START_TAG: {
if ("student".equals(nodeName)) {
student = new Student();
student.setId(Integer.parseInt(xmlPullParser.getAttributeValue(null, "id")));
} else if ("name".equals(nodeName)) {
student.setName(xmlPullParser.nextText());
} else if ("gender".equals(nodeName)) {
student.setGender(Boolean.parseBoolean(xmlPullParser.nextText()));
}
break;
}
//完成某个点的解析
case XmlPullParser.END_TAG: {
if ("student".equals(nodeName)) {
students.add(student);
student = null;
}
break;
}
default:
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return students;
}
public static List<Student> parserXMLWithSAX(String xmlData) {
List<Student> students = null;
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//设置ContentHandler实例
xmlReader.setContentHandler(handler);
//开始解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
students = handler.getStudents();
} catch (Exception e) {
e.printStackTrace();
}
return students;
}
public static List<Student> parserJSONWithJSONObject(String jsonData) {
List<Student> students = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++) {
Student student = new Student();
JSONObject jsonObject = jsonArray.getJSONObject(i);
student.setId(Integer.parseInt(jsonObject.getString("id")));
student.setName(jsonObject.getString("name"));
student.setGender(Boolean.parseBoolean(jsonObject.getString("gender")));
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
}
return students;
}
public static List<Student> parserJSONWithGSON(String jsonData) {
Gson gson = new Gson();//需要gson-2.2.4.jar包
List<Student> students = gson.fromJson(jsonData, new TypeToken<List<Student>>() {
}.getType());
return students;
}
}
class ContentHandler extends DefaultHandler {
private String nodeName;
private List<Student> students;
private Student student;
public List<Student> getStudents() {
return students;
}
@Override
public void startDocument() throws SAXException {
students = new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("student".equals(localName)) {
student = new Student();
String id = attributes.getValue("", "id");
student.setId(Integer.parseInt(id));
}
nodeName = localName;
}
//千古难题:XML中内容节点中的数字怎么解析。student.setAge(Integer.parseInt(content));总是报:NumberFormatException: Invalid int异常。
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length);
if (student != null) {
if ("name".equals(nodeName)) {
student.setName(content);
} else if ("gender".equals(nodeName)) {
student.setGender(Boolean.parseBoolean(content));
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("student".equals(localName)) {
students.add(student);
student = null;
}
}
@Override
public void endDocument() throws SAXException {
}
}
主界面的调用。要用到上一篇博文的知识和内容。
package com.jackie.app_test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
/**
* Created by Administrator on 2016/11/8.
*/
public class TestActivity extends Activity {
private Button btn_parser;
private TextView tv_parser;
private String string;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 55) {
string = (String) msg.obj;
tv_parser.setText(ParserUtil.parserJSONWithGSON(string).toString());
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
btn_parser = (Button) findViewById(R.id.btn_parser);
tv_parser = (TextView) findViewById(R.id.tv_parser);
btn_parser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String string = "http://(本机IP地址)/student_data.json";
HttpUtil.sendHttpRequestWithHttpClient(string, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
Message message = new Message();
message.what = 55;
message.obj = response;
handler.sendMessage(message);
}
@Override
public void onError(Exception e) {
}
});
}
});
}
}