XML,即可扩展标记语言(Extensible Markup Language)非常适合万维网传输,提供统一方法来描述和交换独立于应用程序或供应商的结构化数据,在互联网上被广泛使用。
- 传输数据而非显示数据,需要自定义标签,为纯文本
- 大小写敏感,正确的嵌套,属性值加引号,空格保留,必须有根元素
- ①SAX解析类:SaxHelper.java
public class SaxHelper extends DefaultHandler {
private Person person;
private ArrayList persons;
//当前解析的元素标签
private String tagName = null;
@Override
public void startdocument() throws SAXException {
this.persons = new ArrayList();
Log.i("SAX", "读取到文档头,开始解析xml");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equals("person")) {
person = new Person();
person.setId(Integer.parseInt(attributes.getValue("id")));
Log.i("SAX", "开始处理person元素~");
}
this.tagName = localName;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//判断当前标签是否有效
if (this.tagName != null) {
String data = new String(ch, start, length);
//读取标签中的内容
if (this.tagName.equals("name")) {
this.person.setName(data);
Log.i("SAX", "处理name元素内容");
} else if (this.tagName.equals("age")) {
this.person.setAge(Integer.parseInt(data));
Log.i("SAX", "处理age元素内容");
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName.equals("person")) {
this.persons.add(person);
person = null;
Log.i("SAX", "处理person元素结束~");
}
this.tagName = null;
}
@Override
public void enddocument() throws SAXException {
super.enddocument();
Log.i("SAX", "读取到文档尾,xml解析结束");
}
//获取persons集合
public ArrayList getPersons() {
return persons;
}
}
- ②Dom解析类:
public class DomHelper {
public static ArrayList queryXML(Context context)
{
ArrayList Persons = new ArrayList();
try {
//①获得DOM解析器的工厂示例:
documentBuilderFactory dbFactory = documentBuilderFactory.newInstance();
//②从Dom工厂中获得dom解析器
documentBuilder dbBuilder = dbFactory.newdocumentBuilder();
//③把要解析的xml文件读入Dom解析器
document doc = dbBuilder.parse(context.getAssets().open("person2.xml"));
System.out.println("处理该文档的DomImplemention对象=" + doc.getImplementation());
//④得到文档中名称为person的元素的结点列表
NodeList nList = doc.getElementsByTagName("person");
//⑤遍历该集合,显示集合中的元素以及子元素的名字
for(int i = 0;i < nList.getLength();i++)
{
//先从Person元素开始解析
Element personElement = (Element) nList.item(i);
Person p = new Person();
p.setId(Integer.valueOf(personElement.getAttribute("id")));
//获取person下的name和age的Note集合
NodeList childNoList = personElement.getChildNodes();
for(int j = 0;j < childNoList.getLength();j++)
{
Node childNode = childNoList.item(j);
//判断子note类型是否为元素Note
if(childNode.getNodeType() == Node.ELEMENT_NODE)
{
Element childElement = (Element) childNode;
if("name".equals(childElement.getNodeName()))
p.setName(childElement.getFirstChild().getNodevalue());
else if("age".equals(childElement.getNodeName()))
p.setAge(Integer.valueOf(childElement.getFirstChild().getNodevalue()));
}
}
Persons.add(p);
}
} catch (Exception e) {e.printStackTrace();}
return Persons;
}
}
- ③Pull解析类:
public static ArrayList一 JSON数据 1.1 JSON数据介绍getPersons(InputStream xml)throws Exception{ //XmlPullParserFactory pullPaser = XmlPullParserFactory.newInstance(); ArrayList persons = null; Person person = null; // 创建一个xml解析的工厂 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); // 获得xml解析类的引用 XmlPullParser parser = factory.newPullParser(); parser.setInput(xml, "UTF-8"); // 获得事件的类型 int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_document) { switch (eventType) { case XmlPullParser.START_document: persons = new ArrayList (); break; case XmlPullParser.START_TAG: if ("person".equals(parser.getName())) { person = new Person(); // 取出属性值 int id = Integer.parseInt(parser.getAttributevalue(0)); person.setId(id); } else if ("name".equals(parser.getName())) { String name = parser.nextText();// 获取该节点的内容 person.setName(name); } else if ("age".equals(parser.getName())) { int age = Integer.parseInt(parser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG: if ("person".equals(parser.getName())) { persons.add(person); person = null; } break; } eventType = parser.next(); } return persons; }
- Json是什么?
Javascript Object Natation, 一种轻量级的数据交换格式, 与XML一样, 广泛被采用的客户端和服务端交互的解决方案!具有良好的可读和便于快速编写的特性。 - Json与XML的比较:
-
JSON和XML的数据可读性基本相同;
-
JSON和XML同样拥有丰富的解析手段
-
JSON相对于XML来讲,数据的体积小
-
JSON与Javascript的交互更加方便
-
JSON对数据的描述性比XML较差
-
JSON的速度要远远快于XML
体积小,节省流量,只是不如XML直观,可读性 稍微差一点而已!
-
- Json的格式规范
json一共有两种数据结构-
一种是以 (key/value)对形式存在的无序的jsonObject对象,
一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
例如:{“name”: “xiaoluo”}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型: -
一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。
一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
例如:{[{“key11”:”value11”, “key12”:”value12”},{“key21”:”value21”},{“key31”:”value31”}]}
-
- Json解析类
- JSONObject: Json对象,可以完成Json字符串与Java对象的相互转换
- JSONArray: Json数组,可以完成Json字符串与Java集合或对象的相互转换
- JSONStringer: Json文本构建类,这个类可以帮助快速和便捷的创建JSON text, 每个JSONStringer实体只能对应创建一个JSON text
- JSONTokener:Json解析类
- JSONException:Json异常
代码示例:
json数据: test.json
{
"language":[
{"id":1, "ide":"Eclipse", "name":"Java"},
{"id":2, "ide":"XCode", "name":"Swift"},
{"id":3, "ide":"Visual Studio", "name":"C#"}
],
"cat":"it"
}
数据解析:
try {
InputStreamReader inputStreamReader = new InputStreamReader(getAssets().open("test.json"), "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
StringBuilder stringBuilder = new StringBuilder();
while((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
bufferedReader.close();
inputStreamReader.close();
JSonObject jsonObject = new JSonObject(stringBuilder.toString());
JSonArray jsonArray = jsonObject.getJSonArray("language");
for (int i = 0; i < jsonArray.length(); i++) {
JSonObject object = jsonArray.getJSonObject(i);
Log.i("testjson:", "id=" + object.getInt("id"));
Log.i("testjson:", "name=" + object.getString("name"));
Log.i("testjson:", "ide=" + object.getString("ide"));
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSonException e) {
e.printStackTrace();
}



