XML与JSON的解析

本文操作结合上篇博文-“网络请求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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值