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
- XML与JSON的解析
- Json解析与XML解析的demo
- XML与JSON解析
- XML与JSON解析
- Qt5中JSON与XML的解析
- Json与XML解析的区别比较
- 解析xml与json的总结
- XML解析 与 JSON 解析
- JSON解析与 XML解析的区别比较
- XML的三种解析方式与JSON解析方式
- PHP解析JSON与XML
- PHP解析JSON与XML
- Android xml与json解析
- Unity Json与Xml解析
- JSON文件与XML文件的数据解析
- Json与Xml解析(关卡解锁的例子)
- json与xml创建与解析
- xml解析和json解析的对比
- iOS和Android持续集成
- clearAnimation()解决setVisibility()无效问题
- 在java中如何在非servlet的普通类中获取request、response、session
- Android中RxJava+Retrofit+MVP模式的整合(1)—目录设计
- C#/C++ 文件中插入数据和文件后添加数据的几种方法
- XML与JSON的解析
- (反向代理 + cache) varnish 使用 (实例)
- day11.09
- 苏嵌9 16.11.8
- 将现有的代码,推送到一个新的GitHub Repo中
- 建立虚拟机
- varnish 配置语言 VCL
- 1111. Online Map (30)
- Unity动画知识之二:Animator动画状态机