XML与JSON的解析

来源:互联网 发布:淘宝的水印设置在哪 编辑:程序博客网 时间:2024/06/06 04:22

本文操作结合上篇博文-“网络请求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) {                    }                });            }        });    }}
0 0
原创粉丝点击