java XML解析

首先了解一下XML,XML是可擴展標記語言,看起來像下面這個樣子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
2 <小紙條>
3  <收件人>大元</收件人>
4  <發件人>小張</發件人>
5  <主題>問候</主題>
6  <具體內容>早啊,飯吃了沒? </具體內容>
7 </小紙條>```
第一行爲頭部,展示了版本號和編碼,爲utf-8.
xml中標籤是自己定義的,兩個標籤中的數據爲數值。
在java中解析xml學習的是使用sax
使用sax解析可以分爲5種事件,如下
                        i) 開始文檔事件 startDocument()
                        ii) 開始標籤事件 start Element()
                        iii) 文本事件  charachaers()
                        iv) 結束標籤事件 endElement()
                        v) 結束文檔事件endDocument()
大概流程就是在對應的解析函數中,自己操作數據,將數據取得,然後賦給實體類。下面一步一步的來完成這個過程。
首先第一步
創建一個sax解析工廠,這個工廠使用newInstance方法來得到,而不是創建出來的。
```java
SAXParserFactory factory = SAXParserFactory.newInstance();

第二步通過解析器的工廠來創建一個解析器

1
SAXParser parser = factory.newSAXParser();

然後我們可以通過解析器來解析xml文檔,通過parser(String,handler)其中的String就是文件路徑,不過也可以通過其他的方式,比如流等,文件都可以傳入,問題在於後面的handler,這裏我們需要自己寫一個handler針對不同的需求,所以我們下一步來自定義一個Handler,我們繼承DefaultHandler類,然後重寫這裏面,我們上面提到的5個方法:
整個代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
public class MyHandler extends DefaultHandler{
 
    //結果的集合
    private List<Student> data = null;
 
 
    //當前“組裝” 的對象
    private Student student;
 
    private String tag;//記錄當前解析的標籤
 
 
 
 
    @Override
    public void startDocument() throws SAXException {
 
        //文檔的開始
        //任務:  初始化集合
        data = new ArrayList<>(); // 該方法只會執行一次
    }
 
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
 
        //解析到“元素的開始” , 系統自動調用
 
        //String qName  :  標籤的名字
        //Attributes attributes  :標籤中的屬性(屬性名稱 + 屬性值)
 
        //任務1:  記錄當前解析的標籤是什麼, 方便以後的方法使用:characters()
        tag = qName;
 
        //任務2: 如果是對象的根元素, 那麼創建對象
        if("student".equals(qName))
        {
            student = new Student();
        }
 
 
    }
 
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
 
        String str = new String(ch, start, length).trim();
 
        if ("id".equals(tag)) {
 
            student.setId(Integer.parseInt(str));
        }
        else if("name".equals(tag))
        {
            student.setName(str);
        }
        else if("age".equals(tag))
        {
            student.setAge(Integer.parseInt(str));
        }
        else if("sex".equals(tag))
        {
            student.setSex(str);
        }
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
 
        //解析的元素的結束  qName,正在解析的標籤名
        //任務1, 正在解析的標籤如果是student 說明當前解析的對象已經組裝完成了, 可以放入到集合中
        if("student".equals(qName))
        {
            data.add(student);
        }
 
        tag = "";
 
    }
 
    @Override
    public void endDocument() throws SAXException {
        //文檔結束
 
    }
 
    public List<Student> getList()
    {
        return data;
    }
}

這裏解析的是一個student對象,之後在

1
2
3
4
5
6
7
parser.parse("student.xml", handler);
List<Student> data = handler.getList();
 
        for(Student student:data)
        {
            System.out.println(student);
        }

就能輸出結果
另外,xml文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
 
<students>
 
 
<student>
 
<id>1</id>
 
<name>zhangsan</name>
 
<age>20</age>
 
<sex>male</sex>
 
</student>
 
 
<student>
 
<id>2</id>
 
<name>lisi</name>
 
<age>21</age>
 
<sex>female</sex>
 
</student>
 
</students>

student類根據上面的屬性寫出,然後添加getset方法和toString方法即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章