大家都知道XML是指可扩展标记语言(Extensible Markup Language),它是一种标记语言,很类似HTML.
对于一个xml文件是怎么解析的呢?
简单的介绍一下xml文件的解析
xml文件的解析有以下几种方式
1.dom解析
dom解析xml的优点:
因为分配了一个树形结构,很方便的实现增加、修改、删除的操作。
dom解析xml的缺点:
如果要解析的文件过大,一次性在内存中分配一个树形结构,造成内存的溢出。
2.sax解析
sax解析的方式:边读边解析。
当使用sax方式读到特定的标签时候,自动调用相应的方法进行操作。
sax解析xml的优点:不会造成内存的溢出。
sax解析xml的缺点:不能实现增加、修改、删除的操作。
3.pull解析其实pull解析原理上也是sax解析
重点说一下pull解析
pull解析的步骤:
(1).创建解析器工厂
(2)根据解析器工厂创建解析器
(3)把要操作的文件放到解析器里面
解析stu.xml
1 <?xml version="1.0" encoding="UTF-8"?>
1 <students>
2 <student>
3 <name>lily</name>
4 <age>20</age>
5 </student>
6 <student>
7 <name>zhangsan</name>
8 <age>19</age>
9 </student>
10 </students>
java代码
1 public class TestPull {
1 public static void main(String[] args) throws Exception {
2 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
3 XmlPullParser parser = factory.newPullParser();
4 InputStream in = new FileInputStream("src/stu.xml");
5 parser.setInput(in, "utf-8");
6 List<Student> students = null;
7 Student student = null;
8 int type = 0;
9 // 如果当前解析到的标签,不是文档的结束,继续操作
10 while ((type = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
11 // 得到当前解析的标签的名称
12 String tagName = parser.getName();
13 switch (type) {
14 case XmlPullParser.START_TAG:
15 if ("students".equals(tagName)) {
16 students = new ArrayList<Student>();
17 } else if ("student".equals(tagName)) {
18 student = new Student();
19 } else if ("name".equals(tagName)) {
20 // 得到标签里面的值
21 String name = parser.nextText();
22 student.setName(name);
23 } else if ("age".equals(tagName)) {
24 int age = Integer.parseInt(parser.nextText());
25 student.setAge(age);
26 }
27 break;
28 case XmlPullParser.END_TAG:
29 // 当解析到结束的student时候,把对象放到list集合里面去
30 if ("student".equals(tagName)) {
31 students.add(student);
32 }
33 break;
34 }
35 // 向下执行
36 parser.next();
37 }
38 }
39 }
第10行的while循环语句,判断条件为如果当前解析到的标签不是文档结束标签,就继续解析。
第12行根据获取到的标签的名称;
第24行获取标签里的值。
以上就是pull解析xml文件的步骤以及示例代码;有于pull解析相对而言比较麻烦,所以在日常开发过程中用的不是很频繁
接下来就是第四种解析方式
4.Json解析
JSON(JavaScript Object Notation),JavaScript对象表示法。JSON是一种简单的数据的格式,比xml更加轻巧,是一种轻量级别的数据交互格式。
JSON的规则:
(1) 映射用冒号(”:”)表示。名称:值
(2) 并列的数据之间用逗号(”,”)分隔。名称1:值1,名称2:值2
(3) 映射的集合(对象)用大括号(“{}”)表示。{名称1:值1,名称2:值2}
(4) 并列数据的集合(数组)用方括号(“[]”)表示。
(5) 元素值可具有的类型:string, number, object, array, true, false, null。
解析json的方式有很多种,有很多开源的解析框架,例如org.json,json-lib,gson,我们这里使用org.json进行解析。示例代码如下
1 import org.json.JSONArray;
2 import org.json.JSONException;
3 import org.json.JSONObject;
4 import org.junit.Test;
5
6 public class JsonTest {
7
8 @Test
9 public void TestJsonParser() throws JSONException{
10
11 //自己模拟一个json串
12 String jsoncontent = "{name:'张三',age:'18'}";
13
14 String jsonArray = "[{name:'张三',age:'18'},{name:'李四',age:'28'}]";
15
16 //json 解析小技巧 :看我们解析的json串 如果最外边是{ } 就用JSONObject 如果是[] 就用JSONArray
17 JSONObject obj = new JSONObject(jsoncontent);
18 String name = obj.getString("name");
19 String age = obj.getString("age");
20 System.out.println("name:"+name+"age::"+age);
21
22 JSONArray arr = new JSONArray(jsonArray);
23 JSONObject object = (JSONObject) arr.get(1);
24 String name1 = (String) object.get("name");
25 String age1 = object.getString("age");
26 System.out.println("name:"+name1+"age::"+age1);
27 }
28
}